[{"data":1,"prerenderedAt":67984},["ShallowReactive",2],{"route-doc-meta:/passthrough/{path}/Passthrough_DELETE":3,"content-/sections/passthrough/{path}/Passthrough_DELETE":3,"guides-sidebar":4},null,[5,1585,1813,4547,9665,10228,11286,11539,11629,12180,12500,12695,12826,13550,13604,14159,16347,16990,20494,21628,22565,23213,25316,25994,26996,27812,28825,29962,30794,31154,31446,32246,32867,33077,33279,33432,33563,33652,33794,33856,33946,34071,34171,34246,34542,34668,34777,34931,35003,35292,35368,35509,35578,35706,35781,35878,36189,36411,36630,37029,37234,37293,37364,37443,37604,37909,38069,38180,38304,38672,39866,39958,40153,40464,40597,40900,41202,41335,41571,41706,41823,41962,42090,42407,42669,42849,43146,43649,44032,44530,44743,45480,45613,46304,46692,47379,47778,47923,48804,51890,52899,53109,53218,54287,61657,61860,62336,62829,63913,64208,64460,64794,65927,66023,66467,66806,67137],{"id":6,"title":7,"body":8,"description":27,"extension":1576,"meta":1577,"navigation":271,"path":1581,"seo":1582,"stem":1583,"__hash__":1584},"guides/guides/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data.md","ATS to Vector DB: How to Power Talent Intelligence with Real-Time Data",{"type":9,"value":10,"toc":1561},"minimark",[11,15,18,25,28,31,34,39,42,61,64,66,71,92,94,98,101,165,172,212,214,218,465,467,471,474,482,485,487,491,494,869,871,875,878,1004,1008,1011,1014,1016,1020,1137,1139,1143,1146,1362,1364,1368,1537,1539,1543,1554,1557],[12,13,7],"h1",{"id":14},"ats-to-vector-db-how-to-power-talent-intelligence-with-real-time-data",[16,17],"hr",{},[19,20,21],"p",{},[22,23,24],"em",{},"October 14, 2025",[19,26,27],{},"With Unified, you can a build talent intelligence application that work with your customers' preferred ATS platform, such as Lever and Greenhouse.",[19,29,30],{},"With a single API integration, you can fetch candidate records, normalize and embed resumes, and then push those embeddings into a vector database like Pinecone for real-time search and recruiter agent workflows. This is a complete retrieval-augmented generation (RAG) pipeline for talent intelligence, powered by real-time ATS data.",[19,32,33],{},"This guide shows you how to go from ATS to vector DB, step by step, using Unified, GenAI, and Pinecone.",[35,36,38],"h3",{"id":37},"what-this-rag-pipeline-does","What This RAG Pipeline Does",[19,40,41],{},"This guide walks through a full RAG architecture:",[43,44,45,49,52,55,58],"ol",{},[46,47,48],"li",{},"Fetch normalized candidate data from an ATS.",[46,50,51],{},"Chunk and embed resume content.",[46,53,54],{},"Store embeddings in a vector database.",[46,56,57],{},"Retrieve the most relevant candidates at query time.",[46,59,60],{},"Use retrieved context to power recruiter search, ranking, or AI agents. Unified Use Case RAG Pipelines",[19,62,63],{},"Unified handles ingestion and real-time updates across ATS providers; embeddings and vector storage remain in your infrastructure.",[16,65],{},[67,68,70],"h2",{"id":69},"prerequisites","Prerequisites",[72,73,74,77,80,83,86,89],"ul",{},[46,75,76],{},"Node.js (v18+)",[46,78,79],{},"Unified account with ATS integration enabled (e.g., Lever, Greenhouse)",[46,81,82],{},"Unified API key",[46,84,85],{},"Your customer's ATS connection ID",[46,87,88],{},"Unified GenAI connection ID (or OpenAI API key for embeddings)",[46,90,91],{},"Pinecone API key and environment",[16,93],{},[67,95,97],{"id":96},"step-1-setting-up-your-project","Step 1: Setting up your project",[19,99,100],{},"As always, let's get the basics out of the way!",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-bash shiki shiki-themes github-dark github-dark github-light","mkdir ats-vector-demo\ncd ats-vector-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv @pinecone-database/pinecone openai\n","bash","",[109,110,111,124,133,145],"code",{"__ignoreMap":107},[112,113,116,120],"span",{"class":114,"line":115},"line",1,[112,117,119],{"class":118},"s5n6i","mkdir",[112,121,123],{"class":122},"s4Y1p"," ats-vector-demo\n",[112,125,127,131],{"class":114,"line":126},2,[112,128,130],{"class":129},"sXWYR","cd",[112,132,123],{"class":122},[112,134,136,139,142],{"class":114,"line":135},3,[112,137,138],{"class":118},"npm",[112,140,141],{"class":122}," init",[112,143,144],{"class":129}," -y\n",[112,146,148,150,153,156,159,162],{"class":114,"line":147},4,[112,149,138],{"class":118},[112,151,152],{"class":122}," install",[112,154,155],{"class":122}," @unified-api/typescript-sdk",[112,157,158],{"class":122}," dotenv",[112,160,161],{"class":122}," @pinecone-database/pinecone",[112,163,164],{"class":122}," openai\n",[19,166,167,168,171],{},"Add your credentials to ",[109,169,170],{},".env",":",[102,173,178],{"className":174,"code":175,"language":176,"meta":177,"style":107},"language-plain shiki shiki-themes github-dark github-dark github-light","UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_ATS=your_customer_ats_connection_id\nCONNECTION_GENAI=your_genai_connection_id\nPINECONE_API_KEY=your_pinecone_api_key\nPINECONE_ENVIRONMENT=your_pinecone_env\nPINECONE_INDEX=your_pinecone_index\n","plain","text",[109,179,180,185,190,195,200,206],{"__ignoreMap":107},[112,181,182],{"class":114,"line":115},[112,183,184],{},"UNIFIED_API_KEY=your_unified_api_key\n",[112,186,187],{"class":114,"line":126},[112,188,189],{},"CONNECTION_ATS=your_customer_ats_connection_id\n",[112,191,192],{"class":114,"line":135},[112,193,194],{},"CONNECTION_GENAI=your_genai_connection_id\n",[112,196,197],{"class":114,"line":147},[112,198,199],{},"PINECONE_API_KEY=your_pinecone_api_key\n",[112,201,203],{"class":114,"line":202},5,[112,204,205],{},"PINECONE_ENVIRONMENT=your_pinecone_env\n",[112,207,209],{"class":114,"line":208},6,[112,210,211],{},"PINECONE_INDEX=your_pinecone_index\n",[16,213],{},[67,215,217],{"id":216},"step-2-initialize-the-sdks","Step 2: Initialize the SDKs",[102,219,223],{"className":220,"code":221,"language":222,"meta":107,"style":107},"language-typescript shiki shiki-themes github-dark github-dark github-light","import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { Pinecone } from '@pinecone-database/pinecone';\n\nconst {\n  UNIFIED_API_KEY,\n  CONNECTION_ATS,\n  CONNECTION_GENAI,\n  PINECONE_API_KEY,\n  PINECONE_ENVIRONMENT,\n  PINECONE_INDEX\n} = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n\nconst pinecone = new Pinecone({\n  apiKey: PINECONE_API_KEY!,\n  environment: PINECONE_ENVIRONMENT!,\n});\nconst index = pinecone.Index(PINECONE_INDEX!);\n","typescript",[109,224,225,238,253,267,273,281,289,297,305,313,321,327,339,344,364,379,385,390,407,420,433,438],{"__ignoreMap":107},[112,226,227,231,234],{"class":114,"line":115},[112,228,230],{"class":229},"s6ubI","import",[112,232,233],{"class":122}," 'dotenv/config'",[112,235,237],{"class":236},"sAvwS",";\n",[112,239,240,242,245,248,251],{"class":114,"line":126},[112,241,230],{"class":229},[112,243,244],{"class":236}," { UnifiedTo } ",[112,246,247],{"class":229},"from",[112,249,250],{"class":122}," '@unified-api/typescript-sdk'",[112,252,237],{"class":236},[112,254,255,257,260,262,265],{"class":114,"line":135},[112,256,230],{"class":229},[112,258,259],{"class":236}," { Pinecone } ",[112,261,247],{"class":229},[112,263,264],{"class":122}," '@pinecone-database/pinecone'",[112,266,237],{"class":236},[112,268,269],{"class":114,"line":147},[112,270,272],{"emptyLinePlaceholder":271},true,"\n",[112,274,275,278],{"class":114,"line":202},[112,276,277],{"class":229},"const",[112,279,280],{"class":236}," {\n",[112,282,283,286],{"class":114,"line":208},[112,284,285],{"class":129},"  UNIFIED_API_KEY",[112,287,288],{"class":236},",\n",[112,290,292,295],{"class":114,"line":291},7,[112,293,294],{"class":129},"  CONNECTION_ATS",[112,296,288],{"class":236},[112,298,300,303],{"class":114,"line":299},8,[112,301,302],{"class":129},"  CONNECTION_GENAI",[112,304,288],{"class":236},[112,306,308,311],{"class":114,"line":307},9,[112,309,310],{"class":129},"  PINECONE_API_KEY",[112,312,288],{"class":236},[112,314,316,319],{"class":114,"line":315},10,[112,317,318],{"class":129},"  PINECONE_ENVIRONMENT",[112,320,288],{"class":236},[112,322,324],{"class":114,"line":323},11,[112,325,326],{"class":129},"  PINECONE_INDEX\n",[112,328,330,333,336],{"class":114,"line":329},12,[112,331,332],{"class":236},"} ",[112,334,335],{"class":229},"=",[112,337,338],{"class":236}," process.env;\n",[112,340,342],{"class":114,"line":341},13,[112,343,272],{"emptyLinePlaceholder":271},[112,345,347,349,352,355,358,361],{"class":114,"line":346},14,[112,348,277],{"class":229},[112,350,351],{"class":129}," sdk",[112,353,354],{"class":229}," =",[112,356,357],{"class":229}," new",[112,359,360],{"class":118}," UnifiedTo",[112,362,363],{"class":236},"({\n",[112,365,367,370,373,376],{"class":114,"line":366},15,[112,368,369],{"class":236},"  security: { jwt: ",[112,371,372],{"class":129},"UNIFIED_API_KEY",[112,374,375],{"class":229},"!",[112,377,378],{"class":236}," },\n",[112,380,382],{"class":114,"line":381},16,[112,383,384],{"class":236},"});\n",[112,386,388],{"class":114,"line":387},17,[112,389,272],{"emptyLinePlaceholder":271},[112,391,393,395,398,400,402,405],{"class":114,"line":392},18,[112,394,277],{"class":229},[112,396,397],{"class":129}," pinecone",[112,399,354],{"class":229},[112,401,357],{"class":229},[112,403,404],{"class":118}," Pinecone",[112,406,363],{"class":236},[112,408,410,413,416,418],{"class":114,"line":409},19,[112,411,412],{"class":236},"  apiKey: ",[112,414,415],{"class":129},"PINECONE_API_KEY",[112,417,375],{"class":229},[112,419,288],{"class":236},[112,421,423,426,429,431],{"class":114,"line":422},20,[112,424,425],{"class":236},"  environment: ",[112,427,428],{"class":129},"PINECONE_ENVIRONMENT",[112,430,375],{"class":229},[112,432,288],{"class":236},[112,434,436],{"class":114,"line":435},21,[112,437,384],{"class":236},[112,439,441,443,446,448,451,454,457,460,462],{"class":114,"line":440},22,[112,442,277],{"class":229},[112,444,445],{"class":129}," index",[112,447,354],{"class":229},[112,449,450],{"class":236}," pinecone.",[112,452,453],{"class":118},"Index",[112,455,456],{"class":236},"(",[112,458,459],{"class":129},"PINECONE_INDEX",[112,461,375],{"class":229},[112,463,464],{"class":236},");\n",[16,466],{},[67,468,470],{"id":469},"step-3-how-to-get-your-customers-connection-id","Step 3: How to Get Your Customer's Connection ID",[19,472,473],{},"Before you can fetch candidates, your customer must authorize your app to access their ATS (e.g., Lever, Greenhouse) via Unified's embedded authorization flow.",[19,475,476,477,481],{},"Once authorized, you'll receive a ",[478,479,480],"strong",{},"connection ID"," for that customer's integration.",[19,483,484],{},"Store this connection ID securely and use it in all API calls for that customer.",[16,486],{},[67,488,490],{"id":489},"step-4-fetch-and-normalize-candidate-records","Step 4: Fetch and Normalize Candidate Records",[19,492,493],{},"Fetch candidate records from the ATS and normalize their resumes for embedding. Normalizing resumes before embedding improves retrieval quality and ensures consistent embeddings across 60+ ATS providers.",[102,495,497],{"className":220,"code":496,"language":222,"meta":107,"style":107},"export async function fetchCandidates(connectionId: string) {\n  const candidatesResult = await sdk.ats.listAtsCandidates({\n    connectionId,\n    limit: 10,\n  });\n    return candidatesResult; // AtsCandidate[]\n}\n\nexport function normalizeResume(candidate: any): string {\n  return [\n    `Name: ${candidate.name}`,\n    `Email: ${candidate.emails?.[0]?.email || \"\"}`,\n    `Title: ${candidate.title || \"\"}`,\n    `Summary: ${candidate.summary || \"\"}`,\n    `Experience: ${(candidate.experiences || []).map((exp: any) => `${exp.title} at ${exp.company_name}`).join(\"; \")}`,\n    `Education: ${(candidate.education || []).map((edu: any) => `${edu.degree_name} from ${edu.institution_name}`).join(\"; \")}``\n  ].join('\\\\n');\n}\n",[109,498,499,527,548,553,563,568,580,585,589,617,625,643,675,693,711,787,854,865],{"__ignoreMap":107},[112,500,501,504,507,510,513,515,519,521,524],{"class":114,"line":115},[112,502,503],{"class":229},"export",[112,505,506],{"class":229}," async",[112,508,509],{"class":229}," function",[112,511,512],{"class":118}," fetchCandidates",[112,514,456],{"class":236},[112,516,518],{"class":517},"sAzo5","connectionId",[112,520,171],{"class":229},[112,522,523],{"class":129}," string",[112,525,526],{"class":236},") {\n",[112,528,529,532,535,537,540,543,546],{"class":114,"line":126},[112,530,531],{"class":229},"  const",[112,533,534],{"class":129}," candidatesResult",[112,536,354],{"class":229},[112,538,539],{"class":229}," await",[112,541,542],{"class":236}," sdk.ats.",[112,544,545],{"class":118},"listAtsCandidates",[112,547,363],{"class":236},[112,549,550],{"class":114,"line":135},[112,551,552],{"class":236},"    connectionId,\n",[112,554,555,558,561],{"class":114,"line":147},[112,556,557],{"class":236},"    limit: ",[112,559,560],{"class":129},"10",[112,562,288],{"class":236},[112,564,565],{"class":114,"line":202},[112,566,567],{"class":236},"  });\n",[112,569,570,573,576],{"class":114,"line":208},[112,571,572],{"class":229},"    return",[112,574,575],{"class":236}," candidatesResult; ",[112,577,579],{"class":578},"sxXm1","// AtsCandidate[]\n",[112,581,582],{"class":114,"line":291},[112,583,584],{"class":236},"}\n",[112,586,587],{"class":114,"line":299},[112,588,272],{"emptyLinePlaceholder":271},[112,590,591,593,595,598,600,603,605,608,611,613,615],{"class":114,"line":307},[112,592,503],{"class":229},[112,594,509],{"class":229},[112,596,597],{"class":118}," normalizeResume",[112,599,456],{"class":236},[112,601,602],{"class":517},"candidate",[112,604,171],{"class":229},[112,606,607],{"class":129}," any",[112,609,610],{"class":236},")",[112,612,171],{"class":229},[112,614,523],{"class":129},[112,616,280],{"class":236},[112,618,619,622],{"class":114,"line":315},[112,620,621],{"class":229},"  return",[112,623,624],{"class":236}," [\n",[112,626,627,630,632,635,638,641],{"class":114,"line":323},[112,628,629],{"class":122},"    `Name: ${",[112,631,602],{"class":236},[112,633,634],{"class":122},".",[112,636,637],{"class":236},"name",[112,639,640],{"class":122},"}`",[112,642,288],{"class":236},[112,644,645,648,650,652,655,658,661,664,667,670,673],{"class":114,"line":329},[112,646,647],{"class":122},"    `Email: ${",[112,649,602],{"class":236},[112,651,634],{"class":122},[112,653,654],{"class":236},"emails",[112,656,657],{"class":122},"?.[",[112,659,660],{"class":129},"0",[112,662,663],{"class":122},"]?.",[112,665,666],{"class":236},"email",[112,668,669],{"class":229}," ||",[112,671,672],{"class":122}," \"\"}`",[112,674,288],{"class":236},[112,676,677,680,682,684,687,689,691],{"class":114,"line":341},[112,678,679],{"class":122},"    `Title: ${",[112,681,602],{"class":236},[112,683,634],{"class":122},[112,685,686],{"class":236},"title",[112,688,669],{"class":229},[112,690,672],{"class":122},[112,692,288],{"class":236},[112,694,695,698,700,702,705,707,709],{"class":114,"line":346},[112,696,697],{"class":122},"    `Summary: ${",[112,699,602],{"class":236},[112,701,634],{"class":122},[112,703,704],{"class":236},"summary",[112,706,669],{"class":229},[112,708,672],{"class":122},[112,710,288],{"class":236},[112,712,713,716,718,720,722,725,727,730,733,736,739,741,743,746,749,752,754,756,758,761,763,765,768,770,773,776,778,781,783,785],{"class":114,"line":366},[112,714,715],{"class":122},"    `Experience: ${",[112,717,456],{"class":122},[112,719,602],{"class":236},[112,721,634],{"class":122},[112,723,724],{"class":236},"experiences",[112,726,669],{"class":229},[112,728,729],{"class":122}," []).",[112,731,732],{"class":118},"map",[112,734,735],{"class":122},"((",[112,737,738],{"class":129},"exp",[112,740,171],{"class":229},[112,742,607],{"class":129},[112,744,745],{"class":122},") ",[112,747,748],{"class":229},"=>",[112,750,751],{"class":122}," `${",[112,753,738],{"class":236},[112,755,634],{"class":122},[112,757,686],{"class":236},[112,759,760],{"class":122},"} at ${",[112,762,738],{"class":236},[112,764,634],{"class":122},[112,766,767],{"class":236},"company_name",[112,769,640],{"class":122},[112,771,772],{"class":122},").",[112,774,775],{"class":118},"join",[112,777,456],{"class":122},[112,779,780],{"class":122},"\"; \"",[112,782,610],{"class":122},[112,784,640],{"class":122},[112,786,288],{"class":236},[112,788,789,792,794,796,798,801,803,805,807,809,812,814,816,818,820,822,824,826,829,832,834,836,839,841,843,845,847,849,851],{"class":114,"line":381},[112,790,791],{"class":122},"    `Education: ${",[112,793,456],{"class":122},[112,795,602],{"class":236},[112,797,634],{"class":122},[112,799,800],{"class":236},"education",[112,802,669],{"class":229},[112,804,729],{"class":122},[112,806,732],{"class":118},[112,808,735],{"class":122},[112,810,811],{"class":129},"edu",[112,813,171],{"class":229},[112,815,607],{"class":129},[112,817,745],{"class":122},[112,819,748],{"class":229},[112,821,751],{"class":122},[112,823,811],{"class":236},[112,825,634],{"class":122},[112,827,828],{"class":236},"degree_name",[112,830,831],{"class":122},"} from ${",[112,833,811],{"class":236},[112,835,634],{"class":122},[112,837,838],{"class":236},"institution_name",[112,840,640],{"class":122},[112,842,772],{"class":122},[112,844,775],{"class":118},[112,846,456],{"class":122},[112,848,780],{"class":122},[112,850,610],{"class":122},[112,852,853],{"class":122},"}``\n",[112,855,856,859,862],{"class":114,"line":387},[112,857,858],{"class":122},"  ].join('",[112,860,861],{"class":129},"\\\\",[112,863,864],{"class":122},"n');\n",[112,866,867],{"class":114,"line":392},[112,868,584],{"class":122},[16,870],{},[67,872,874],{"id":873},"step-5-embed-resumes-with-genai","Step 5: Embed Resumes with GenAI",[19,876,877],{},"Use Unified GenAI to embed the normalized resume text.",[102,879,881],{"className":220,"code":880,"language":222,"meta":107,"style":107},"export async function embedResume(resumeText: string) {\n  const result = await sdk.genai.createGenaiEmbedding({\n    connectionId: CONNECTION_GENAI!,\n    embedding: {\n      content: {\n        text: resumeText,\n      },\n      model_id: 'text-embedding-3-small',\n      maxTokens: 1024,\n      enconding_format: 'FLOAT'\n    },\n  });\n  return result.embeddings;\n}\n",[109,882,883,905,924,936,941,946,951,956,966,976,984,989,993,1000],{"__ignoreMap":107},[112,884,885,887,889,891,894,896,899,901,903],{"class":114,"line":115},[112,886,503],{"class":229},[112,888,506],{"class":229},[112,890,509],{"class":229},[112,892,893],{"class":118}," embedResume",[112,895,456],{"class":236},[112,897,898],{"class":517},"resumeText",[112,900,171],{"class":229},[112,902,523],{"class":129},[112,904,526],{"class":236},[112,906,907,909,912,914,916,919,922],{"class":114,"line":126},[112,908,531],{"class":229},[112,910,911],{"class":129}," result",[112,913,354],{"class":229},[112,915,539],{"class":229},[112,917,918],{"class":236}," sdk.genai.",[112,920,921],{"class":118},"createGenaiEmbedding",[112,923,363],{"class":236},[112,925,926,929,932,934],{"class":114,"line":135},[112,927,928],{"class":236},"    connectionId: ",[112,930,931],{"class":129},"CONNECTION_GENAI",[112,933,375],{"class":229},[112,935,288],{"class":236},[112,937,938],{"class":114,"line":147},[112,939,940],{"class":236},"    embedding: {\n",[112,942,943],{"class":114,"line":202},[112,944,945],{"class":236},"      content: {\n",[112,947,948],{"class":114,"line":208},[112,949,950],{"class":236},"        text: resumeText,\n",[112,952,953],{"class":114,"line":291},[112,954,955],{"class":236},"      },\n",[112,957,958,961,964],{"class":114,"line":299},[112,959,960],{"class":236},"      model_id: ",[112,962,963],{"class":122},"'text-embedding-3-small'",[112,965,288],{"class":236},[112,967,968,971,974],{"class":114,"line":307},[112,969,970],{"class":236},"      maxTokens: ",[112,972,973],{"class":129},"1024",[112,975,288],{"class":236},[112,977,978,981],{"class":114,"line":315},[112,979,980],{"class":236},"      enconding_format: ",[112,982,983],{"class":122},"'FLOAT'\n",[112,985,986],{"class":114,"line":323},[112,987,988],{"class":236},"    },\n",[112,990,991],{"class":114,"line":329},[112,992,567],{"class":236},[112,994,995,997],{"class":114,"line":341},[112,996,621],{"class":229},[112,998,999],{"class":236}," result.embeddings;\n",[112,1001,1002],{"class":114,"line":346},[112,1003,584],{"class":236},[35,1005,1007],{"id":1006},"keeping-the-vector-index-up-to-date","Keeping the Vector Index Up to Date",[19,1009,1010],{},"To keep your RAG pipeline current, subscribe to ATS webhooks for candidate create or update events. When a resume changes, re-fetch the candidate, re-embed the content, and update the vector index.\nUnified Use Case RAG Pipelines",[19,1012,1013],{},"This ensures your talent intelligence reflects the latest application data in real time.",[16,1015],{},[67,1017,1019],{"id":1018},"step-6-push-embeddings-to-pinecone","Step 6: Push Embeddings to Pinecone",[102,1021,1023],{"className":220,"code":1022,"language":222,"meta":107,"style":107},"export async function upsertCandidateToPinecone(candidate: any, embedding: number[]) {\n  await index.upsert([\n    {\n      id: candidate.id,\n      values: embedding,\n      metadata: {\n        name: candidate.name,\n        email: candidate.emails?.[0]?.email || \"\",\n        candidate_id: candidate.id,\n      },\n    },\n  ]);\n}\n",[109,1024,1025,1058,1072,1077,1082,1087,1092,1097,1115,1120,1124,1128,1133],{"__ignoreMap":107},[112,1026,1027,1029,1031,1033,1036,1038,1040,1042,1044,1047,1050,1052,1055],{"class":114,"line":115},[112,1028,503],{"class":229},[112,1030,506],{"class":229},[112,1032,509],{"class":229},[112,1034,1035],{"class":118}," upsertCandidateToPinecone",[112,1037,456],{"class":236},[112,1039,602],{"class":517},[112,1041,171],{"class":229},[112,1043,607],{"class":129},[112,1045,1046],{"class":236},", ",[112,1048,1049],{"class":517},"embedding",[112,1051,171],{"class":229},[112,1053,1054],{"class":129}," number",[112,1056,1057],{"class":236},"[]) {\n",[112,1059,1060,1063,1066,1069],{"class":114,"line":126},[112,1061,1062],{"class":229},"  await",[112,1064,1065],{"class":236}," index.",[112,1067,1068],{"class":118},"upsert",[112,1070,1071],{"class":236},"([\n",[112,1073,1074],{"class":114,"line":135},[112,1075,1076],{"class":236},"    {\n",[112,1078,1079],{"class":114,"line":147},[112,1080,1081],{"class":236},"      id: candidate.id,\n",[112,1083,1084],{"class":114,"line":202},[112,1085,1086],{"class":236},"      values: embedding,\n",[112,1088,1089],{"class":114,"line":208},[112,1090,1091],{"class":236},"      metadata: {\n",[112,1093,1094],{"class":114,"line":291},[112,1095,1096],{"class":236},"        name: candidate.name,\n",[112,1098,1099,1102,1104,1107,1110,1113],{"class":114,"line":299},[112,1100,1101],{"class":236},"        email: candidate.emails?.[",[112,1103,660],{"class":129},[112,1105,1106],{"class":236},"]?.email ",[112,1108,1109],{"class":229},"||",[112,1111,1112],{"class":122}," \"\"",[112,1114,288],{"class":236},[112,1116,1117],{"class":114,"line":307},[112,1118,1119],{"class":236},"        candidate_id: candidate.id,\n",[112,1121,1122],{"class":114,"line":315},[112,1123,955],{"class":236},[112,1125,1126],{"class":114,"line":323},[112,1127,988],{"class":236},[112,1129,1130],{"class":114,"line":329},[112,1131,1132],{"class":236},"  ]);\n",[112,1134,1135],{"class":114,"line":341},[112,1136,584],{"class":236},[16,1138],{},[67,1140,1142],{"id":1141},"step-7-simple-retrieval-flow","Step 7: Simple Retrieval Flow",[19,1144,1145],{},"Given a recruiter query, embed it and search Pinecone for the most relevant candidates.",[102,1147,1149],{"className":220,"code":1148,"language":222,"meta":107,"style":107},"export async function searchCandidates(query: string) {\n\n  const result = await sdk.genai.createGenaiPrompt({\n    connectionId: CONNECTION_GENAI!,\n    prompt: {\n      messages: [{ role: \"USER\", content: `Embed this query:\\\\n${query}` }],\n      maxTokens: 1024,\n      temperature: 0.0,\n      responseFormat: \"embedding\",\n    },\n  });\n  const queryEmbedding = result.choices?.[0]?.message?.embedding || [];\n\n\n  const pineconeResults = await index.query({\n    vector: queryEmbedding,\n    topK: 5,\n    includeMetadata: true,\n  });\n\n  return pineconeResults.matches;\n}\n",[109,1150,1151,1173,1177,1194,1204,1209,1235,1243,1253,1263,1267,1271,1293,1297,1301,1318,1323,1333,1343,1347,1351,1358],{"__ignoreMap":107},[112,1152,1153,1155,1157,1159,1162,1164,1167,1169,1171],{"class":114,"line":115},[112,1154,503],{"class":229},[112,1156,506],{"class":229},[112,1158,509],{"class":229},[112,1160,1161],{"class":118}," searchCandidates",[112,1163,456],{"class":236},[112,1165,1166],{"class":517},"query",[112,1168,171],{"class":229},[112,1170,523],{"class":129},[112,1172,526],{"class":236},[112,1174,1175],{"class":114,"line":126},[112,1176,272],{"emptyLinePlaceholder":271},[112,1178,1179,1181,1183,1185,1187,1189,1192],{"class":114,"line":135},[112,1180,531],{"class":229},[112,1182,911],{"class":129},[112,1184,354],{"class":229},[112,1186,539],{"class":229},[112,1188,918],{"class":236},[112,1190,1191],{"class":118},"createGenaiPrompt",[112,1193,363],{"class":236},[112,1195,1196,1198,1200,1202],{"class":114,"line":147},[112,1197,928],{"class":236},[112,1199,931],{"class":129},[112,1201,375],{"class":229},[112,1203,288],{"class":236},[112,1205,1206],{"class":114,"line":202},[112,1207,1208],{"class":236},"    prompt: {\n",[112,1210,1211,1214,1217,1220,1223,1225,1228,1230,1232],{"class":114,"line":208},[112,1212,1213],{"class":236},"      messages: [{ role: ",[112,1215,1216],{"class":122},"\"USER\"",[112,1218,1219],{"class":236},", content: ",[112,1221,1222],{"class":122},"`Embed this query:",[112,1224,861],{"class":129},[112,1226,1227],{"class":122},"n${",[112,1229,1166],{"class":236},[112,1231,640],{"class":122},[112,1233,1234],{"class":236}," }],\n",[112,1236,1237,1239,1241],{"class":114,"line":291},[112,1238,970],{"class":236},[112,1240,973],{"class":129},[112,1242,288],{"class":236},[112,1244,1245,1248,1251],{"class":114,"line":299},[112,1246,1247],{"class":236},"      temperature: ",[112,1249,1250],{"class":129},"0.0",[112,1252,288],{"class":236},[112,1254,1255,1258,1261],{"class":114,"line":307},[112,1256,1257],{"class":236},"      responseFormat: ",[112,1259,1260],{"class":122},"\"embedding\"",[112,1262,288],{"class":236},[112,1264,1265],{"class":114,"line":315},[112,1266,988],{"class":236},[112,1268,1269],{"class":114,"line":323},[112,1270,567],{"class":236},[112,1272,1273,1275,1278,1280,1283,1285,1288,1290],{"class":114,"line":329},[112,1274,531],{"class":229},[112,1276,1277],{"class":129}," queryEmbedding",[112,1279,354],{"class":229},[112,1281,1282],{"class":236}," result.choices?.[",[112,1284,660],{"class":129},[112,1286,1287],{"class":236},"]?.message?.embedding ",[112,1289,1109],{"class":229},[112,1291,1292],{"class":236}," [];\n",[112,1294,1295],{"class":114,"line":341},[112,1296,272],{"emptyLinePlaceholder":271},[112,1298,1299],{"class":114,"line":346},[112,1300,272],{"emptyLinePlaceholder":271},[112,1302,1303,1305,1308,1310,1312,1314,1316],{"class":114,"line":366},[112,1304,531],{"class":229},[112,1306,1307],{"class":129}," pineconeResults",[112,1309,354],{"class":229},[112,1311,539],{"class":229},[112,1313,1065],{"class":236},[112,1315,1166],{"class":118},[112,1317,363],{"class":236},[112,1319,1320],{"class":114,"line":381},[112,1321,1322],{"class":236},"    vector: queryEmbedding,\n",[112,1324,1325,1328,1331],{"class":114,"line":387},[112,1326,1327],{"class":236},"    topK: ",[112,1329,1330],{"class":129},"5",[112,1332,288],{"class":236},[112,1334,1335,1338,1341],{"class":114,"line":392},[112,1336,1337],{"class":236},"    includeMetadata: ",[112,1339,1340],{"class":129},"true",[112,1342,288],{"class":236},[112,1344,1345],{"class":114,"line":409},[112,1346,567],{"class":236},[112,1348,1349],{"class":114,"line":422},[112,1350,272],{"emptyLinePlaceholder":271},[112,1352,1353,1355],{"class":114,"line":435},[112,1354,621],{"class":229},[112,1356,1357],{"class":236}," pineconeResults.matches;\n",[112,1359,1360],{"class":114,"line":440},[112,1361,584],{"class":236},[16,1363],{},[67,1365,1367],{"id":1366},"step-8-example-usage","Step 8: Example Usage",[102,1369,1371],{"className":220,"code":1370,"language":222,"meta":107,"style":107},"async function main() {\n\n  const candidates = await fetchCandidates(CONNECTION_ATS!);\n  for (const candidate of candidates) {\n    const resumeText = normalizeResume(candidate);\n    const embedding = await embedResume(resumeText);\n    await upsertCandidateToPinecone(candidate, embedding);\n  }\n\n\n  const matches = await searchCandidates(\"Senior Python developer with fintech experience\");\n  console.log(\"Top matches:\", matches);\n}\n\nmain();\n",[109,1372,1373,1386,1390,1412,1431,1446,1462,1472,1477,1481,1485,1505,1521,1525,1529],{"__ignoreMap":107},[112,1374,1375,1378,1380,1383],{"class":114,"line":115},[112,1376,1377],{"class":229},"async",[112,1379,509],{"class":229},[112,1381,1382],{"class":118}," main",[112,1384,1385],{"class":236},"() {\n",[112,1387,1388],{"class":114,"line":126},[112,1389,272],{"emptyLinePlaceholder":271},[112,1391,1392,1394,1397,1399,1401,1403,1405,1408,1410],{"class":114,"line":135},[112,1393,531],{"class":229},[112,1395,1396],{"class":129}," candidates",[112,1398,354],{"class":229},[112,1400,539],{"class":229},[112,1402,512],{"class":118},[112,1404,456],{"class":236},[112,1406,1407],{"class":129},"CONNECTION_ATS",[112,1409,375],{"class":229},[112,1411,464],{"class":236},[112,1413,1414,1417,1420,1422,1425,1428],{"class":114,"line":147},[112,1415,1416],{"class":229},"  for",[112,1418,1419],{"class":236}," (",[112,1421,277],{"class":229},[112,1423,1424],{"class":129}," candidate",[112,1426,1427],{"class":229}," of",[112,1429,1430],{"class":236}," candidates) {\n",[112,1432,1433,1436,1439,1441,1443],{"class":114,"line":202},[112,1434,1435],{"class":229},"    const",[112,1437,1438],{"class":129}," resumeText",[112,1440,354],{"class":229},[112,1442,597],{"class":118},[112,1444,1445],{"class":236},"(candidate);\n",[112,1447,1448,1450,1453,1455,1457,1459],{"class":114,"line":208},[112,1449,1435],{"class":229},[112,1451,1452],{"class":129}," embedding",[112,1454,354],{"class":229},[112,1456,539],{"class":229},[112,1458,893],{"class":118},[112,1460,1461],{"class":236},"(resumeText);\n",[112,1463,1464,1467,1469],{"class":114,"line":291},[112,1465,1466],{"class":229},"    await",[112,1468,1035],{"class":118},[112,1470,1471],{"class":236},"(candidate, embedding);\n",[112,1473,1474],{"class":114,"line":299},[112,1475,1476],{"class":236},"  }\n",[112,1478,1479],{"class":114,"line":307},[112,1480,272],{"emptyLinePlaceholder":271},[112,1482,1483],{"class":114,"line":315},[112,1484,272],{"emptyLinePlaceholder":271},[112,1486,1487,1489,1492,1494,1496,1498,1500,1503],{"class":114,"line":323},[112,1488,531],{"class":229},[112,1490,1491],{"class":129}," matches",[112,1493,354],{"class":229},[112,1495,539],{"class":229},[112,1497,1161],{"class":118},[112,1499,456],{"class":236},[112,1501,1502],{"class":122},"\"Senior Python developer with fintech experience\"",[112,1504,464],{"class":236},[112,1506,1507,1510,1513,1515,1518],{"class":114,"line":329},[112,1508,1509],{"class":236},"  console.",[112,1511,1512],{"class":118},"log",[112,1514,456],{"class":236},[112,1516,1517],{"class":122},"\"Top matches:\"",[112,1519,1520],{"class":236},", matches);\n",[112,1522,1523],{"class":114,"line":341},[112,1524,584],{"class":236},[112,1526,1527],{"class":114,"line":346},[112,1528,272],{"emptyLinePlaceholder":271},[112,1530,1531,1534],{"class":114,"line":366},[112,1532,1533],{"class":118},"main",[112,1535,1536],{"class":236},"();\n",[16,1538],{},[67,1540,1542],{"id":1541},"what-just-happened","What just happened?",[72,1544,1545,1548,1551],{},[46,1546,1547],{},"And just like that you can fetch candidate records from any ATS (Lever, Greenhouse, etc.) using a single API.",[46,1549,1550],{},"You can then normalize and embed resumes with Unified GenAI, push them into Pinecone, and power a RAG-based recruiter search layer.",[46,1552,1553],{},"Recruiters can then search for talent using natural language, and retrieve the most relevant candidates instantly.",[19,1555,1556],{},"Happy Building! 🎉",[1558,1559,1560],"style",{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":107,"searchDepth":126,"depth":126,"links":1562},[1563,1564,1565,1566,1567,1568,1569,1572,1573,1574,1575],{"id":37,"depth":135,"text":38},{"id":69,"depth":126,"text":70},{"id":96,"depth":126,"text":97},{"id":216,"depth":126,"text":217},{"id":469,"depth":126,"text":470},{"id":489,"depth":126,"text":490},{"id":873,"depth":126,"text":874,"children":1570},[1571],{"id":1006,"depth":135,"text":1007},{"id":1018,"depth":126,"text":1019},{"id":1141,"depth":126,"text":1142},{"id":1366,"depth":126,"text":1367},{"id":1541,"depth":126,"text":1542},"md",{"img":1578,"date":1579,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data-icon.png","2025-10-14T00:00:00.000Z","Guides","/guides/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data",{"title":7,"description":27},"guides/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data","aTe_kon0dfrTUuXq3FnWOvWpaeLZ1P5SfjzTYxZePzM",{"id":1586,"title":1587,"body":1588,"description":1805,"extension":1576,"meta":1806,"navigation":271,"path":1809,"seo":1810,"stem":1811,"__hash__":1812},"guides/guides/building_ai_applications_with_unified_and_langbase.md","Building AI applications with Unified and Langbase",{"type":9,"value":1589,"toc":1799},[1590,1593,1595,1600,1607,1610,1621,1625,1628,1660,1664,1667,1672,1681,1684,1692,1700,1705,1720,1723,1728,1731,1736,1743,1747,1750,1775,1779,1782,1796],[12,1591,1587],{"id":1592},"building-ai-applications-with-unified-and-langbase",[16,1594],{},[19,1596,1597],{},[22,1598,1599],{},"February 27, 2025",[19,1601,1602],{},[1603,1604],"img",{"alt":1605,"src":1606},"unified_langbase_2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/building_ai_applications_with_unified_and_langbase-0.png",[19,1608,1609],{},"Developers building AI applications for their customers face a common challenge: they need to juggle many different APIs and authorization flows, configure and manage multiple data pipelines, and deal with complex data models. What if you could focus on building amazing AI experiences without getting bogged down by all that complexity?",[19,1611,1612,1613,1620],{},"That's where the power of Unified.to's APIs combined with ",[1614,1615,1619],"a",{"href":1616,"rel":1617},"https://langbase.com/",[1618],"nofollow","Langbase's"," serverless AI developer platform comes in. In this article, we'll look at how you can leverage these platforms to build sophisticated AI applications using your customers' data while writing significantly less integration and AI boilerplate code.",[67,1622,1624],{"id":1623},"why-use-unifiedto-with-langbase","Why use Unified.to with Langbase?",[19,1626,1627],{},"When you pair Unified.to's normalized data access with Langbase's AI capabilities, you get:",[72,1629,1630,1642,1648,1654],{},[46,1631,1632,1635,1636,1641],{},[478,1633,1634],{},"One API, many integrations:"," Instead of building separate integrations for each platform, use ",[1614,1637,1640],{"href":1638,"rel":1639},"https://unified.to/",[1618],"Unified.to","'s unified APIs to access normalized data from multiple data sources through a single, unified API. Langbase does the same for AI—with multi-agent orchestration and advanced long-term memory, seamlessly integrating AI capabilities. It supports 250+ LLMs through one API, ensuring a unified developer experience with easy model switching and optimization. It's an API-first platform, with simple Pipe and Memory Agent APIs for effortless integration.",[46,1643,1644,1647],{},[478,1645,1646],{},"Unified authorization:"," Seamlessly handle authorization with Unified.to's pre-built components, creating a secure link between your app and your customers' data with just a few lines of code.",[46,1649,1650,1653],{},[478,1651,1652],{},"Production-ready AI:"," Langbase Pipes and Memory Agents (serverless RAG agents with long-term memory) eliminate infrastructure management, making scaling and deployment seamless for all developers—not just AI/ML experts. Its composable AI infrastructure lets developers chain multiple models into AI pipelines, optimizing cost, performance, and personalization at every step.",[46,1655,1656,1659],{},[478,1657,1658],{},"Real-time updates:"," Build dynamic applications using Unified.to's webhook system. Fine-tine AI models on the fly when your customers have new data, allowing your AI agent to provide more relevant responses.",[67,1661,1663],{"id":1662},"real-world-applications-you-can-build","Real-world applications you can build",[19,1665,1666],{},"Let's look at some practical applications you can create by combining these platforms.",[19,1668,1669],{},[478,1670,1671],{},"Intelligent support bots",[19,1673,1674,1675,1680],{},"Build an AI-powered support bot that can answer questions using your customer's knowledge base, handle real-time inquiries, and maintain context across conversations. By combining Unified.to's KMS (Knowledge Management System) and messaging APIs with ",[1614,1676,1679],{"href":1677,"rel":1678},"https://langbase.com/docs/memory",[1618],"Langbase's Memory Agents"," , you can create a bot that gets smarter as your knowledge base grows.",[19,1682,1683],{},"The best part? Since you're using unified APIs, you can easily adapt this pattern for different platforms:",[72,1685,1686,1689],{},[46,1687,1688],{},"Use Notion, Confluence or other KMS platforms for your knowledge base",[46,1690,1691],{},"Deploy your bot on Slack instead of Discord",[19,1693,1694,1695],{},"Want to build your own? Check out our step-by-step ",[1614,1696,1699],{"href":1697,"rel":1698},"https://docs.unified.to/guides/how_to_build_a_discord_support_bot_with_unified_and_langbase#how-to-build-a-discord-support-bot-with-unifiedto-and-langbase",[1618],"guide on building a Discord support bot.",[19,1701,1702],{},[478,1703,1704],{},"AI-powered recruitment assistant",[19,1706,1707,1708,1713,1714,1719],{},"Create an intelligent recruiting assistant that streamlines your hiring process by automatically screening candidates, conducting initial interviews, updating candidates' application statuses, and providing detailed summaries to your hiring team. Using Unified.to's ",[1614,1709,1712],{"href":1710,"rel":1711},"https://unified.to/ats",[1618],"ATS integrations"," and Langbase ",[1614,1715,1718],{"href":1716,"rel":1717},"https://langbase.com/docs/pipe/quickstart",[1618],"Pipe agents",", your assistant can handle the time-consuming parts of recruitment while maintaining a personal touch.",[19,1721,1722],{},"The unified approach means you can support multiple ATS platforms (Lever, Greenhouse, Workday, etc.) without rewriting your core logic.",[19,1724,1725],{},[478,1726,1727],{},"Enhanced email agents",[19,1729,1730],{},"With Unified.to and Langbase, you can automate email responses and streamline communication. By combining Unified.to's email integrations with Langbase's composable multi-agent architecture, you can build an AI-powered email workflow that enhances efficiency and personalization.",[19,1732,1733],{},[478,1734,1735],{},"Intelligent sales assistant",[19,1737,1738,1739,1742],{},"Supercharge your sales team with an AI assistant that understands your customer relationships, helps qualify leads, and generates personalized follow-ups based on past interactions. Using Unified.to's CRM integrations with ",[1614,1740,1679],{"href":1677,"rel":1741},[1618]," (that dynamically attach private data to any LLM at scale, with industry-leading accuracy in advanced agentic routing and intelligent reranking), you can create an assistant that becomes an invaluable part of your sales process. Create leads and deals in your CRM automatically and tap into Unified.to's Enrichment API to add extra contextual data for the Memory Agent.",[67,1744,1746],{"id":1745},"getting-started","Getting started",[19,1748,1749],{},"Ready to start building? Here's how to get going:",[43,1751,1752,1763,1772],{},[46,1753,1754,1755,1758,1759],{},"Sign up for accounts on ",[1614,1756,1640],{"href":1638,"rel":1757},[1618]," and",[1614,1760,1762],{"href":1616,"rel":1761},[1618]," Langbase",[46,1764,1765,1766,1771],{},"Join our ",[1614,1767,1770],{"href":1768,"rel":1769},"https://discord.gg/85z7HF7JbD",[1618],"Discord community"," to connect with other developers",[46,1773,1774],{},"Keep an eye on our blog for upcoming guides in this series",[67,1776,1778],{"id":1777},"looking-ahead","Looking ahead",[19,1780,1781],{},"The combination of Unified.to and Langbase opens up exciting possibilities for AI application development. As both platforms continue to evolve, you can expect:",[72,1783,1784,1787,1790,1793],{},[46,1785,1786],{},"More supported platforms and integrations",[46,1788,1789],{},"Enhanced AI capabilities through Langbase's Memory Agents",[46,1791,1792],{},"New unified APIs for different use cases",[46,1794,1795],{},"Expanded tutorials and example applications",[19,1797,1798],{},"Stay tuned for our upcoming tutorials that will dive deep into each use case, providing concrete examples and code you can use in your own applications.",{"title":107,"searchDepth":126,"depth":126,"links":1800},[1801,1802,1803,1804],{"id":1623,"depth":126,"text":1624},{"id":1662,"depth":126,"text":1663},{"id":1745,"depth":126,"text":1746},{"id":1777,"depth":126,"text":1778},"Developers building AI applications for their customers face a common challenge, they need to juggle many different APIs and authorization flows, configure and...",{"img":1807,"date":1808,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/building_ai_applications_with_unified_and_langbase-icon.png","2025-02-27T00:00:00.000Z","/guides/building_ai_applications_with_unified_and_langbase",{"title":1587,"description":1805},"guides/building_ai_applications_with_unified_and_langbase","IgTEL24lQAloWswS9vGj09AFqHWMGhVIP_M03ipsfC4",{"id":1814,"title":1815,"body":1816,"description":4539,"extension":1576,"meta":4540,"navigation":271,"path":4543,"seo":4544,"stem":4545,"__hash__":4546},"guides/guides/creating_ads_using_the_unified_ads_api.md","Creating Ads using the Unified Ads API",{"type":9,"value":1817,"toc":4501},[1818,1821,1823,1828,1832,1835,1839,1842,1867,1969,1973,2030,2034,2083,2087,2114,2118,2121,2232,2237,2241,2244,2286,2295,2297,2301,2307,2316,2408,2410,2414,2417,2480,2484,2596,2598,2602,2608,2616,2621,2699,2703,2716,2719,2795,2799,2811,2815,2827,2844,2848,2863,2865,2869,2873,2952,2956,3045,3049,3127,3131,3208,3212,3287,3289,3293,3302,3306,3309,3316,3320,3400,3448,3465,3469,3489,3491,3582,3586,3605,3607,3659,3663,3682,3686,3702,3752,3754,3758,3762,3765,3808,3811,3955,3959,4069,4073,4079,4157,4184,4188,4340,4344,4347,4386,4395,4496,4498],[12,1819,1815],{"id":1820},"creating-ads-using-the-unified-ads-api",[16,1822],{},[19,1824,1825],{},[22,1826,1827],{},"March 14, 2026",[12,1829,1831],{"id":1830},"unified-ads-api-overview","Unified Ads API Overview",[19,1833,1834],{},"The Unified API Ads category models advertising structures across Meta, Google, Amazon, Twitter, LinkedIn, and other providers. Understanding how objects relate helps you build the correc flows.",[35,1836,1838],{"id":1837},"core-hierarchy","Core Hierarchy",[19,1840,1841],{},"Most integrations follow a hierarchy from organization → campaign → ad group → ad:",[102,1843,1845],{"className":174,"code":1844,"language":176,"meta":177,"style":107},"ads_organization (ad account)\n    └── ads_campaign\n            └── ads_group (ad set, line item, etc.)\n                    └── ads_ad\n",[109,1846,1847,1852,1857,1862],{"__ignoreMap":107},[112,1848,1849],{"class":114,"line":115},[112,1850,1851],{},"ads_organization (ad account)\n",[112,1853,1854],{"class":114,"line":126},[112,1855,1856],{},"    └── ads_campaign\n",[112,1858,1859],{"class":114,"line":135},[112,1860,1861],{},"            └── ads_group (ad set, line item, etc.)\n",[112,1863,1864],{"class":114,"line":147},[112,1865,1866],{},"                    └── ads_ad\n",[1868,1869,1870,1889],"table",{},[1871,1872,1873],"thead",{},[1874,1875,1876,1880,1883,1886],"tr",{},[1877,1878,1879],"th",{},"Object",[1877,1881,1882],{},"Description",[1877,1884,1885],{},"Parent(s)",[1877,1887,1888],{},"Typical use",[1890,1891,1892,1909,1927,1947],"tbody",{},[1874,1893,1894,1900,1903,1906],{},[1895,1896,1897],"td",{},[478,1898,1899],{},"ads_organization",[1895,1901,1902],{},"The ad account (e.g., Meta ad account, Google Ads customer). Billing and access are scoped here.",[1895,1904,1905],{},"—",[1895,1907,1908],{},"List accounts, select which account to use",[1874,1910,1911,1916,1919,1924],{},[1895,1912,1913],{},[478,1914,1915],{},"ads_campaign",[1895,1917,1918],{},"A campaign groups ad sets under a goal, budget, and schedule.",[1895,1920,1921],{},[109,1922,1923],{},"organization_id",[1895,1925,1926],{},"Set campaign-level budget, dates, objective",[1874,1928,1929,1934,1937,1944],{},[1895,1930,1931],{},[478,1932,1933],{},"ads_group",[1895,1935,1936],{},"An ad set or line item. Holds targeting, bid, and budget. Often called \"ad set\" (Meta) or \"line item\" (DV360).",[1895,1938,1939,1046,1942],{},[109,1940,1941],{},"campaign_id",[109,1943,1923],{},[1895,1945,1946],{},"Define who sees ads (targeting), bid strategy, promoted object",[1874,1948,1949,1954,1957,1966],{},[1895,1950,1951],{},[478,1952,1953],{},"ads_ad",[1895,1955,1956],{},"The actual ad creative + placement. What users see.",[1895,1958,1959,1046,1962,1046,1964],{},[109,1960,1961],{},"group_id",[109,1963,1941],{},[109,1965,1923],{},[1895,1967,1968],{},"Creative content, destination URL, promoted entity (e.g., tweet, product)",[35,1970,1972],{"id":1971},"creatives-and-insertion-orders","Creatives and Insertion Orders",[1868,1974,1975,1988],{},[1871,1976,1977],{},[1874,1978,1979,1981,1983,1985],{},[1877,1980,1879],{},[1877,1982,1882],{},[1877,1984,1885],{},[1877,1986,1987],{},"Notes",[1890,1989,1990,2011],{},[1874,1991,1992,1997,2000,2008],{},[1895,1993,1994],{},[478,1995,1996],{},"ads_creative",[1895,1998,1999],{},"The creative asset (image, video, copy). Some providers treat it as a separate resource; others embed it in the ad.",[1895,2001,2002,1046,2004,1046,2006],{},[109,2003,1961],{},[109,2005,1941],{},[109,2007,1923],{},[1895,2009,2010],{},"Meta: can be shared across ads. Amazon/Twitter: often 1:1 with ad.",[1874,2012,2013,2018,2021,2027],{},[1895,2014,2015],{},[478,2016,2017],{},"ads_insertionorder",[1895,2019,2020],{},"DV360-specific. Sits between campaign and line item.",[1895,2022,2023,1046,2025],{},[109,2024,1941],{},[109,2026,1923],{},[1895,2028,2029],{},"Similar to a purchase order for a campaign.",[35,2031,2033],{"id":2032},"discovery","Discovery",[1868,2035,2036,2047],{},[1871,2037,2038],{},[1874,2039,2040,2042,2044],{},[1877,2041,1879],{},[1877,2043,1882],{},[1877,2045,2046],{},"Purpose",[1890,2048,2049,2066],{},[1874,2050,2051,2056,2059],{},[1895,2052,2053],{},[478,2054,2055],{},"ads_target",[1895,2057,2058],{},"Targeting options (countries, regions, interests, etc.).",[1895,2060,2061,2062,2065],{},"Look up valid IDs to use in ",[109,2063,2064],{},"targeting"," when creating campaigns/groups.",[1874,2067,2068,2073,2076],{},[1895,2069,2070],{},[478,2071,2072],{},"ads_promote",[1895,2074,2075],{},"Promoted entities (pages, apps, products, tweets, ad group types).",[1895,2077,2078,2079,2082],{},"Look up or pass IDs for ",[109,2080,2081],{},"promoted"," when creating groups/ads/creatives.",[35,2084,2086],{"id":2085},"reporting","Reporting",[1868,2088,2089,2099],{},[1871,2090,2091],{},[1874,2092,2093,2095,2097],{},[1877,2094,1879],{},[1877,2096,1882],{},[1877,2098,2046],{},[1890,2100,2101],{},[1874,2102,2103,2108,2111],{},[1895,2104,2105],{},[478,2106,2107],{},"ads_report",[1895,2109,2110],{},"Performance metrics.",[1895,2112,2113],{},"Fetch impressions, clicks, spend, etc. by org, campaign, group, or ad.",[35,2115,2117],{"id":2116},"provider-mapping","Provider Mapping",[19,2119,2120],{},"Naming varies by provider:",[1868,2122,2123,2145],{},[1871,2124,2125],{},[1874,2126,2127,2130,2133,2136,2139,2142],{},[1877,2128,2129],{},"Unified API",[1877,2131,2132],{},"Meta Ads",[1877,2134,2135],{},"Google Ads",[1877,2137,2138],{},"Amazon Ads",[1877,2140,2141],{},"Twitter Ads",[1877,2143,2144],{},"LinkedIn",[1890,2146,2147,2166,2182,2199,2217],{},[1874,2148,2149,2151,2154,2157,2160,2163],{},[1895,2150,1899],{},[1895,2152,2153],{},"Ad Account",[1895,2155,2156],{},"Customer",[1895,2158,2159],{},"Profile",[1895,2161,2162],{},"Account",[1895,2164,2165],{},"Sponsored Account",[1874,2167,2168,2170,2173,2175,2177,2179],{},[1895,2169,1915],{},[1895,2171,2172],{},"Campaign",[1895,2174,2172],{},[1895,2176,2172],{},[1895,2178,2172],{},[1895,2180,2181],{},"Campaign Group",[1874,2183,2184,2186,2189,2192,2194,2197],{},[1895,2185,1933],{},[1895,2187,2188],{},"Ad Set",[1895,2190,2191],{},"Ad Group",[1895,2193,2191],{},[1895,2195,2196],{},"Line Item",[1895,2198,2172],{},[1874,2200,2201,2203,2206,2208,2211,2214],{},[1895,2202,1953],{},[1895,2204,2205],{},"Ad",[1895,2207,2205],{},[1895,2209,2210],{},"Product Ad",[1895,2212,2213],{},"Promoted Tweet",[1895,2215,2216],{},"Creative",[1874,2218,2219,2221,2224,2226,2228,2230],{},[1895,2220,1996],{},[1895,2222,2223],{},"Ad Creative",[1895,2225,2205],{},[1895,2227,2210],{},[1895,2229,2213],{},[1895,2231,2216],{},[19,2233,2234],{},[22,2235,2236],{},"Some integrations collapse levels (e.g., LinkedIn's \"Campaign\" maps to our ads_group).",[35,2238,2240],{"id":2239},"creating-ads-required-parent-ids","Creating Ads: Required Parent IDs",[19,2242,2243],{},"When creating objects, you typically need parent IDs:",[72,2245,2246,2254,2263,2274],{},[46,2247,2248,2251,2252],{},[478,2249,2250],{},"Create campaign:"," ",[109,2253,1923],{},[46,2255,2256,2251,2259,1046,2261],{},[478,2257,2258],{},"Create ad group:",[109,2260,1923],{},[109,2262,1941],{},[46,2264,2265,2251,2268,1046,2270,1046,2272],{},[478,2266,2267],{},"Create ad:",[109,2269,1923],{},[109,2271,1941],{},[109,2273,1961],{},[46,2275,2276,2251,2279,1046,2281,1046,2283,2285],{},[478,2277,2278],{},"Create creative:",[109,2280,1923],{},[109,2282,1941],{},[109,2284,1961],{}," (varies by provider)",[19,2287,2288,2289,2291,2292,2294],{},"The ",[109,2290,2081],{}," field is required when creating ad groups or ads that need a promoted entity (e.g., Meta ad set with a page, Twitter promoted tweet with a tweet ID). Use ",[109,2293,2072],{}," to discover options, or pass IDs manually when the provider has no list API.",[16,2296],{},[12,2298,2300],{"id":2299},"promoted-explained","Promoted Explained",[19,2302,2303,2304,2306],{},"The new ",[109,2305,2081],{}," field specifies promoted entities (pages, apps, products, tweets, ad group types) when creating and managing ads across the Unified API.",[19,2308,2309,2310,2312,2313,2315],{},"Ads, Campaigns, and AdGroups have a ",[109,2311,2081],{}," field to specify an ID of an entity to promote.  There is also a ",[109,2314,2072],{}," endpoint that provides a clean way to query the promoted entities.",[102,2317,2321],{"className":2318,"code":2319,"language":2320,"meta":107,"style":107},"language-json shiki shiki-themes github-dark github-dark github-light","{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"My Ad Group\",\n  \"promoted\": [\n    { \"id\": \"789\", \"type\": \"PAGE_ID\" }\n  ]\n}\n","json",[109,2322,2323,2328,2341,2353,2365,2373,2399,2404],{"__ignoreMap":107},[112,2324,2325],{"class":114,"line":115},[112,2326,2327],{"class":236},"{\n",[112,2329,2330,2333,2336,2339],{"class":114,"line":126},[112,2331,2332],{"class":129},"  \"organization_id\"",[112,2334,2335],{"class":236},": ",[112,2337,2338],{"class":122},"\"act_123\"",[112,2340,288],{"class":236},[112,2342,2343,2346,2348,2351],{"class":114,"line":135},[112,2344,2345],{"class":129},"  \"campaign_id\"",[112,2347,2335],{"class":236},[112,2349,2350],{"class":122},"\"456\"",[112,2352,288],{"class":236},[112,2354,2355,2358,2360,2363],{"class":114,"line":147},[112,2356,2357],{"class":129},"  \"name\"",[112,2359,2335],{"class":236},[112,2361,2362],{"class":122},"\"My Ad Group\"",[112,2364,288],{"class":236},[112,2366,2367,2370],{"class":114,"line":202},[112,2368,2369],{"class":129},"  \"promoted\"",[112,2371,2372],{"class":236},": [\n",[112,2374,2375,2378,2381,2383,2386,2388,2391,2393,2396],{"class":114,"line":208},[112,2376,2377],{"class":236},"    { ",[112,2379,2380],{"class":129},"\"id\"",[112,2382,2335],{"class":236},[112,2384,2385],{"class":122},"\"789\"",[112,2387,1046],{"class":236},[112,2389,2390],{"class":129},"\"type\"",[112,2392,2335],{"class":236},[112,2394,2395],{"class":122},"\"PAGE_ID\"",[112,2397,2398],{"class":236}," }\n",[112,2400,2401],{"class":114,"line":291},[112,2402,2403],{"class":236},"  ]\n",[112,2405,2406],{"class":114,"line":299},[112,2407,584],{"class":236},[16,2409],{},[67,2411,2413],{"id":2412},"the-adspromoted-object","The AdsPromoted Object",[19,2415,2416],{},"Each promoted entity has a simple structure:",[1868,2418,2419,2434],{},[1871,2420,2421],{},[1874,2422,2423,2426,2429,2432],{},[1877,2424,2425],{},"Field",[1877,2427,2428],{},"Type",[1877,2430,2431],{},"Required",[1877,2433,1882],{},[1890,2435,2436,2452,2466],{},[1874,2437,2438,2443,2446,2449],{},[1895,2439,2440],{},[109,2441,2442],{},"id",[1895,2444,2445],{},"string",[1895,2447,2448],{},"Yes",[1895,2450,2451],{},"The entity ID (e.g., page ID, ASIN, tweet ID)",[1874,2453,2454,2458,2460,2463],{},[1895,2455,2456],{},[109,2457,637],{},[1895,2459,2445],{},[1895,2461,2462],{},"No",[1895,2464,2465],{},"Display name (optional, used in list responses)",[1874,2467,2468,2473,2475,2477],{},[1895,2469,2470],{},[109,2471,2472],{},"type",[1895,2474,2445],{},[1895,2476,2448],{},[1895,2478,2479],{},"One of the supported promoted types (see below)",[35,2481,2483],{"id":2482},"supported-promoted-types","Supported Promoted Types",[1868,2485,2486,2497],{},[1871,2487,2488],{},[1874,2489,2490,2492,2495],{},[1877,2491,2428],{},[1877,2493,2494],{},"Integration(s)",[1877,2496,1882],{},[1890,2498,2499,2511,2523,2535,2547,2559,2571,2583],{},[1874,2500,2501,2506,2508],{},[1895,2502,2503],{},[109,2504,2505],{},"PAGE_ID",[1895,2507,2132],{},[1895,2509,2510],{},"Facebook Page to promote",[1874,2512,2513,2518,2520],{},[1895,2514,2515],{},[109,2516,2517],{},"APP_ID",[1895,2519,2132],{},[1895,2521,2522],{},"App to promote",[1874,2524,2525,2530,2532],{},[1895,2526,2527],{},[109,2528,2529],{},"PIXEL_ID",[1895,2531,2132],{},[1895,2533,2534],{},"Conversion pixel",[1874,2536,2537,2542,2544],{},[1895,2538,2539],{},[109,2540,2541],{},"CATALOG_ID",[1895,2543,2132],{},[1895,2545,2546],{},"Product catalog",[1874,2548,2549,2554,2556],{},[1895,2550,2551],{},[109,2552,2553],{},"STORE_URL",[1895,2555,2132],{},[1895,2557,2558],{},"Store URL (manual input)",[1874,2560,2561,2566,2568],{},[1895,2562,2563],{},[109,2564,2565],{},"PRODUCT_ID",[1895,2567,2138],{},[1895,2569,2570],{},"Product ASIN (manual input)",[1874,2572,2573,2578,2580],{},[1895,2574,2575],{},[109,2576,2577],{},"TWEET_ID",[1895,2579,2141],{},[1895,2581,2582],{},"Tweet to promote",[1874,2584,2585,2590,2593],{},[1895,2586,2587],{},[109,2588,2589],{},"AD_GROUP_TYPE",[1895,2591,2592],{},"LinkedIn, Google Ads",[1895,2594,2595],{},"Campaign/ad group type (e.g., SPONSORED_UPDATES, SEARCH_STANDARD)",[16,2597],{},[67,2599,2601],{"id":2600},"get-adsconnection_idpromoted-endpoint","GET /ads/{connection_id}/promoted Endpoint",[19,2603,2604,2605,2607],{},"Use the ",[109,2606,2072],{}," list endpoint to discover available promoted entities that the integration supports.",[19,2609,2610,2251,2613],{},[478,2611,2612],{},"Endpoint:",[109,2614,2615],{},"GET /ads/{connection_id}/promote",[19,2617,2618],{},[478,2619,2620],{},"Query parameters:",[1868,2622,2623,2634],{},[1871,2624,2625],{},[1874,2626,2627,2630,2632],{},[1877,2628,2629],{},"Parameter",[1877,2631,2428],{},[1877,2633,1882],{},[1890,2635,2636,2651,2663,2674,2687],{},[1874,2637,2638,2642,2644],{},[1895,2639,2640],{},[109,2641,2472],{},[1895,2643,2445],{},[1895,2645,2646,2647,1046,2649,610],{},"Filter by promoted type (e.g., ",[109,2648,2505],{},[109,2650,2577],{},[1874,2652,2653,2658,2660],{},[1895,2654,2655],{},[109,2656,2657],{},"org_id",[1895,2659,2445],{},[1895,2661,2662],{},"Organization/account I",[1874,2664,2665,2669,2671],{},[1895,2666,2667],{},[109,2668,1166],{},[1895,2670,2445],{},[1895,2672,2673],{},"Optional search filter",[1874,2675,2676,2681,2684],{},[1895,2677,2678],{},[109,2679,2680],{},"limit",[1895,2682,2683],{},"number",[1895,2685,2686],{},"Max results (default 100)",[1874,2688,2689,2694,2696],{},[1895,2690,2691],{},[109,2692,2693],{},"offset",[1895,2695,2683],{},[1895,2697,2698],{},"Pagination offset",[35,2700,2702],{"id":2701},"example-list-facebook-pages-meta-ads","Example: List Facebook Pages (Meta Ads)",[102,2704,2706],{"className":104,"code":2705,"language":106,"meta":107,"style":107},"GET /ads/{connection_id}/promote?type=PAGE_ID\n",[109,2707,2708],{"__ignoreMap":107},[112,2709,2710,2713],{"class":114,"line":115},[112,2711,2712],{"class":118},"GET",[112,2714,2715],{"class":122}," /ads/{connection_id}/promote?type=PAGE_ID\n",[19,2717,2718],{},"Response:",[102,2720,2722],{"className":2318,"code":2721,"language":2320,"meta":107,"style":107},"[\n    { \"id\": \"123456789\", \"name\": \"My Business Page\", \"type\": \"PAGE_ID\" },\n    { \"id\": \"987654321\", \"name\": \"Another Page\", \"type\": \"PAGE_ID\" }\n]\n",[109,2723,2724,2729,2760,2790],{"__ignoreMap":107},[112,2725,2726],{"class":114,"line":115},[112,2727,2728],{"class":236},"[\n",[112,2730,2731,2733,2735,2737,2740,2742,2745,2747,2750,2752,2754,2756,2758],{"class":114,"line":126},[112,2732,2377],{"class":236},[112,2734,2380],{"class":129},[112,2736,2335],{"class":236},[112,2738,2739],{"class":122},"\"123456789\"",[112,2741,1046],{"class":236},[112,2743,2744],{"class":129},"\"name\"",[112,2746,2335],{"class":236},[112,2748,2749],{"class":122},"\"My Business Page\"",[112,2751,1046],{"class":236},[112,2753,2390],{"class":129},[112,2755,2335],{"class":236},[112,2757,2395],{"class":122},[112,2759,378],{"class":236},[112,2761,2762,2764,2766,2768,2771,2773,2775,2777,2780,2782,2784,2786,2788],{"class":114,"line":135},[112,2763,2377],{"class":236},[112,2765,2380],{"class":129},[112,2767,2335],{"class":236},[112,2769,2770],{"class":122},"\"987654321\"",[112,2772,1046],{"class":236},[112,2774,2744],{"class":129},[112,2776,2335],{"class":236},[112,2778,2779],{"class":122},"\"Another Page\"",[112,2781,1046],{"class":236},[112,2783,2390],{"class":129},[112,2785,2335],{"class":236},[112,2787,2395],{"class":122},[112,2789,2398],{"class":236},[112,2791,2792],{"class":114,"line":147},[112,2793,2794],{"class":236},"]\n",[35,2796,2798],{"id":2797},"example-list-user-tweets-twitter-ads","Example: List User Tweets (Twitter Ads)",[102,2800,2802],{"className":104,"code":2801,"language":106,"meta":107,"style":107},"GET /ads/{connection_id}/promote?type=TWEET_ID\n",[109,2803,2804],{"__ignoreMap":107},[112,2805,2806,2808],{"class":114,"line":115},[112,2807,2712],{"class":118},[112,2809,2810],{"class":122}," /ads/{connection_id}/promote?type=TWEET_ID\n",[35,2812,2814],{"id":2813},"example-list-ad-group-types-google-ads-linkedin","Example: List Ad Group Types (Google Ads, LinkedIn)",[102,2816,2818],{"className":104,"code":2817,"language":106,"meta":107,"style":107},"GET /ads/{connection_id}/promote?type=AD_GROUP_TYPE\n",[109,2819,2820],{"__ignoreMap":107},[112,2821,2822,2824],{"class":114,"line":115},[112,2823,2712],{"class":118},[112,2825,2826],{"class":122}," /ads/{connection_id}/promote?type=AD_GROUP_TYPE\n",[19,2828,2829,2830,1046,2833,2836,2837,1046,2840,2843],{},"Some integrations will return static options (e.g., ",[109,2831,2832],{},"SEARCH_STANDARD",[109,2834,2835],{},"DISPLAY_STANDARD"," for Google; ",[109,2838,2839],{},"SPONSORED_UPDATES",[109,2841,2842],{},"TEXT_ADS"," for LinkedIn).",[35,2845,2847],{"id":2846},"when-ads_promoted-returns-empty","When ads_promoted Returns Empty",[19,2849,2850,2851,2853,2854,2856,2857,2859,2860,2862],{},"Some promoted types have no discovery API (e.g., Amazon ",[109,2852,2565],{},", Meta ",[109,2855,2553],{},"). In those cases, ",[109,2858,2072],{}," returns an empty array. You can still create ads by passing ",[109,2861,2081],{}," manually with IDs you already know (e.g., ASINs for Amazon, store URLs for Meta).",[16,2864],{},[67,2866,2868],{"id":2867},"quick-reference-create-examples","Quick Reference: Create Examples",[35,2870,2872],{"id":2871},"meta-ads-create-ad-group-with-page","Meta Ads – Create Ad Group with Page",[102,2874,2876],{"className":2318,"code":2875,"language":2320,"meta":107,"style":107},"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"My Ad Group\",\n  \"promoted\": [{ \"id\": \"789\", \"type\": \"PAGE_ID\" }]\n}\n",[109,2877,2878,2890,2894,2904,2914,2924,2948],{"__ignoreMap":107},[112,2879,2880,2883,2887],{"class":114,"line":115},[112,2881,2882],{"class":236},"POST /ads/{",[112,2884,2886],{"class":2885},"sgQC_","connection_id",[112,2888,2889],{"class":236},"}/group\n",[112,2891,2892],{"class":114,"line":126},[112,2893,2327],{"class":236},[112,2895,2896,2898,2900,2902],{"class":114,"line":135},[112,2897,2332],{"class":129},[112,2899,2335],{"class":236},[112,2901,2338],{"class":122},[112,2903,288],{"class":236},[112,2905,2906,2908,2910,2912],{"class":114,"line":147},[112,2907,2345],{"class":129},[112,2909,2335],{"class":236},[112,2911,2350],{"class":122},[112,2913,288],{"class":236},[112,2915,2916,2918,2920,2922],{"class":114,"line":202},[112,2917,2357],{"class":129},[112,2919,2335],{"class":236},[112,2921,2362],{"class":122},[112,2923,288],{"class":236},[112,2925,2926,2928,2931,2933,2935,2937,2939,2941,2943,2945],{"class":114,"line":208},[112,2927,2369],{"class":129},[112,2929,2930],{"class":236},": [{ ",[112,2932,2380],{"class":129},[112,2934,2335],{"class":236},[112,2936,2385],{"class":122},[112,2938,1046],{"class":236},[112,2940,2390],{"class":129},[112,2942,2335],{"class":236},[112,2944,2395],{"class":122},[112,2946,2947],{"class":236}," }]\n",[112,2949,2950],{"class":114,"line":291},[112,2951,584],{"class":236},[35,2953,2955],{"id":2954},"amazon-ads-create-product-ad","Amazon Ads – Create Product Ad",[102,2957,2959],{"className":2318,"code":2958,"language":2320,"meta":107,"style":107},"POST /ads/{connection_id}/ad\n{\n  \"organization_id\": \"profile_123\",\n  \"campaign_id\": \"456\",\n  \"group_id\": \"789\",\n  \"name\": \"Product Ad\",\n  \"promoted\": [{ \"id\": \"B08N5WRWNW\", \"type\": \"PRODUCT_ID\" }]\n}\n",[109,2960,2961,2970,2974,2985,2995,3006,3017,3041],{"__ignoreMap":107},[112,2962,2963,2965,2967],{"class":114,"line":115},[112,2964,2882],{"class":236},[112,2966,2886],{"class":2885},[112,2968,2969],{"class":236},"}/ad\n",[112,2971,2972],{"class":114,"line":126},[112,2973,2327],{"class":236},[112,2975,2976,2978,2980,2983],{"class":114,"line":135},[112,2977,2332],{"class":129},[112,2979,2335],{"class":236},[112,2981,2982],{"class":122},"\"profile_123\"",[112,2984,288],{"class":236},[112,2986,2987,2989,2991,2993],{"class":114,"line":147},[112,2988,2345],{"class":129},[112,2990,2335],{"class":236},[112,2992,2350],{"class":122},[112,2994,288],{"class":236},[112,2996,2997,3000,3002,3004],{"class":114,"line":202},[112,2998,2999],{"class":129},"  \"group_id\"",[112,3001,2335],{"class":236},[112,3003,2385],{"class":122},[112,3005,288],{"class":236},[112,3007,3008,3010,3012,3015],{"class":114,"line":208},[112,3009,2357],{"class":129},[112,3011,2335],{"class":236},[112,3013,3014],{"class":122},"\"Product Ad\"",[112,3016,288],{"class":236},[112,3018,3019,3021,3023,3025,3027,3030,3032,3034,3036,3039],{"class":114,"line":291},[112,3020,2369],{"class":129},[112,3022,2930],{"class":236},[112,3024,2380],{"class":129},[112,3026,2335],{"class":236},[112,3028,3029],{"class":122},"\"B08N5WRWNW\"",[112,3031,1046],{"class":236},[112,3033,2390],{"class":129},[112,3035,2335],{"class":236},[112,3037,3038],{"class":122},"\"PRODUCT_ID\"",[112,3040,2947],{"class":236},[112,3042,3043],{"class":114,"line":299},[112,3044,584],{"class":236},[35,3046,3048],{"id":3047},"twitter-ads-create-promoted-tweet","Twitter Ads – Create Promoted Tweet",[102,3050,3052],{"className":2318,"code":3051,"language":2320,"meta":107,"style":107},"POST /ads/{connection_id}/ad\n{\n  \"organization_id\": \"account_123\",\n  \"group_id\": \"line_item_456\",\n  \"name\": \"Promoted Tweet\",\n  \"promoted\": [{ \"id\": \"1234567890\", \"type\": \"TWEET_ID\" }]\n}\n",[109,3053,3054,3062,3066,3077,3088,3099,3123],{"__ignoreMap":107},[112,3055,3056,3058,3060],{"class":114,"line":115},[112,3057,2882],{"class":236},[112,3059,2886],{"class":2885},[112,3061,2969],{"class":236},[112,3063,3064],{"class":114,"line":126},[112,3065,2327],{"class":236},[112,3067,3068,3070,3072,3075],{"class":114,"line":135},[112,3069,2332],{"class":129},[112,3071,2335],{"class":236},[112,3073,3074],{"class":122},"\"account_123\"",[112,3076,288],{"class":236},[112,3078,3079,3081,3083,3086],{"class":114,"line":147},[112,3080,2999],{"class":129},[112,3082,2335],{"class":236},[112,3084,3085],{"class":122},"\"line_item_456\"",[112,3087,288],{"class":236},[112,3089,3090,3092,3094,3097],{"class":114,"line":202},[112,3091,2357],{"class":129},[112,3093,2335],{"class":236},[112,3095,3096],{"class":122},"\"Promoted Tweet\"",[112,3098,288],{"class":236},[112,3100,3101,3103,3105,3107,3109,3112,3114,3116,3118,3121],{"class":114,"line":208},[112,3102,2369],{"class":129},[112,3104,2930],{"class":236},[112,3106,2380],{"class":129},[112,3108,2335],{"class":236},[112,3110,3111],{"class":122},"\"1234567890\"",[112,3113,1046],{"class":236},[112,3115,2390],{"class":129},[112,3117,2335],{"class":236},[112,3119,3120],{"class":122},"\"TWEET_ID\"",[112,3122,2947],{"class":236},[112,3124,3125],{"class":114,"line":291},[112,3126,584],{"class":236},[35,3128,3130],{"id":3129},"linkedin-create-ad-group-campaign","LinkedIn – Create Ad Group (Campaign)",[102,3132,3134],{"className":2318,"code":3133,"language":2320,"meta":107,"style":107},"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"Sponsored Updates Campaign\",\n  \"promoted\": [{ \"id\": \"SPONSORED_UPDATES\", \"type\": \"AD_GROUP_TYPE\" }]\n}\n",[109,3135,3136,3144,3148,3159,3169,3180,3204],{"__ignoreMap":107},[112,3137,3138,3140,3142],{"class":114,"line":115},[112,3139,2882],{"class":236},[112,3141,2886],{"class":2885},[112,3143,2889],{"class":236},[112,3145,3146],{"class":114,"line":126},[112,3147,2327],{"class":236},[112,3149,3150,3152,3154,3157],{"class":114,"line":135},[112,3151,2332],{"class":129},[112,3153,2335],{"class":236},[112,3155,3156],{"class":122},"\"123\"",[112,3158,288],{"class":236},[112,3160,3161,3163,3165,3167],{"class":114,"line":147},[112,3162,2345],{"class":129},[112,3164,2335],{"class":236},[112,3166,2350],{"class":122},[112,3168,288],{"class":236},[112,3170,3171,3173,3175,3178],{"class":114,"line":202},[112,3172,2357],{"class":129},[112,3174,2335],{"class":236},[112,3176,3177],{"class":122},"\"Sponsored Updates Campaign\"",[112,3179,288],{"class":236},[112,3181,3182,3184,3186,3188,3190,3193,3195,3197,3199,3202],{"class":114,"line":208},[112,3183,2369],{"class":129},[112,3185,2930],{"class":236},[112,3187,2380],{"class":129},[112,3189,2335],{"class":236},[112,3191,3192],{"class":122},"\"SPONSORED_UPDATES\"",[112,3194,1046],{"class":236},[112,3196,2390],{"class":129},[112,3198,2335],{"class":236},[112,3200,3201],{"class":122},"\"AD_GROUP_TYPE\"",[112,3203,2947],{"class":236},[112,3205,3206],{"class":114,"line":291},[112,3207,584],{"class":236},[35,3209,3211],{"id":3210},"google-ads-create-ad-group","Google Ads – Create Ad Group",[102,3213,3215],{"className":2318,"code":3214,"language":2320,"meta":107,"style":107},"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"Search Ad Group\",\n  \"promoted\": [{ \"id\": \"SEARCH_STANDARD\", \"type\": \"AD_GROUP_TYPE\" }]\n}\n",[109,3216,3217,3225,3229,3239,3249,3260,3283],{"__ignoreMap":107},[112,3218,3219,3221,3223],{"class":114,"line":115},[112,3220,2882],{"class":236},[112,3222,2886],{"class":2885},[112,3224,2889],{"class":236},[112,3226,3227],{"class":114,"line":126},[112,3228,2327],{"class":236},[112,3230,3231,3233,3235,3237],{"class":114,"line":135},[112,3232,2332],{"class":129},[112,3234,2335],{"class":236},[112,3236,3156],{"class":122},[112,3238,288],{"class":236},[112,3240,3241,3243,3245,3247],{"class":114,"line":147},[112,3242,2345],{"class":129},[112,3244,2335],{"class":236},[112,3246,2350],{"class":122},[112,3248,288],{"class":236},[112,3250,3251,3253,3255,3258],{"class":114,"line":202},[112,3252,2357],{"class":129},[112,3254,2335],{"class":236},[112,3256,3257],{"class":122},"\"Search Ad Group\"",[112,3259,288],{"class":236},[112,3261,3262,3264,3266,3268,3270,3273,3275,3277,3279,3281],{"class":114,"line":208},[112,3263,2369],{"class":129},[112,3265,2930],{"class":236},[112,3267,2380],{"class":129},[112,3269,2335],{"class":236},[112,3271,3272],{"class":122},"\"SEARCH_STANDARD\"",[112,3274,1046],{"class":236},[112,3276,2390],{"class":129},[112,3278,2335],{"class":236},[112,3280,3201],{"class":122},[112,3282,2947],{"class":236},[112,3284,3285],{"class":114,"line":291},[112,3286,584],{"class":236},[16,3288],{},[67,3290,3292],{"id":3291},"using-targeting","Using Targeting",[19,3294,3295,3296,3298,3299,3301],{},"Targeting lets you define who sees your ads (geography, demographics, interests, etc.). Use the ",[109,3297,2055],{}," endpoint to look up valid targeting IDs, then pass them in the ",[109,3300,2064],{}," field when creating campaigns, ad groups, or ads.",[35,3303,3305],{"id":3304},"the-ads_target-endpoint","The ads_target Endpoint",[19,3307,3308],{},"Look up targeting options (countries, regions, cities, interests, etc.) before creating ad objects.",[19,3310,3311,2251,3313],{},[478,3312,2612],{},[109,3314,3315],{},"GET /ads/{connection_id}/target",[19,3317,3318],{},[478,3319,2620],{},[1868,3321,3322,3334],{},[1871,3323,3324],{},[1874,3325,3326,3328,3330,3332],{},[1877,3327,2629],{},[1877,3329,2428],{},[1877,3331,2431],{},[1877,3333,1882],{},[1890,3335,3336,3349,3363,3376,3388],{},[1874,3337,3338,3342,3344,3346],{},[1895,3339,3340],{},[109,3341,2472],{},[1895,3343,2445],{},[1895,3345,2448],{},[1895,3347,3348],{},"Targeting type (see supported types below)",[1874,3350,3351,3355,3357,3360],{},[1895,3352,3353],{},[109,3354,1166],{},[1895,3356,2445],{},[1895,3358,3359],{},"Yes*",[1895,3361,3362],{},"Search term (*required for most types)",[1874,3364,3365,3369,3371,3373],{},[1895,3366,3367],{},[109,3368,2657],{},[1895,3370,2445],{},[1895,3372,2462],{},[1895,3374,3375],{},"Organization/account ID (required for some types)",[1874,3377,3378,3382,3384,3386],{},[1895,3379,3380],{},[109,3381,2680],{},[1895,3383,2683],{},[1895,3385,2462],{},[1895,3387,2686],{},[1874,3389,3390,3394,3396,3398],{},[1895,3391,3392],{},[109,3393,2693],{},[1895,3395,2683],{},[1895,3397,2462],{},[1895,3399,2698],{},[19,3401,3402,2251,3405,2251,3409,2251,3412,1046,3415,1046,3418,1046,3421,1046,3424,1046,3427,1046,3430,1046,3433,1046,3436,1046,3439,1046,3442,1046,3445],{},[478,3403,3404],{},"Supported",[478,3406,3407],{},[109,3408,2472],{},[478,3410,3411],{},"values:",[109,3413,3414],{},"countries",[109,3416,3417],{},"regions",[109,3419,3420],{},"cities",[109,3422,3423],{},"zips",[109,3425,3426],{},"us_dmas",[109,3428,3429],{},"locales",[109,3431,3432],{},"interests",[109,3434,3435],{},"behaviors",[109,3437,3438],{},"topics",[109,3440,3441],{},"user_lists",[109,3443,3444],{},"age_ranges",[109,3446,3447],{},"genders",[19,3449,3450,2251,3453,2251,3457,2251,3460],{},[22,3451,3452],{},"Support varies by integration. Meta Ads supports most types; others (e.g., Amazon, Twitter) may support only",[22,3454,3455],{},[109,3456,3414],{},[22,3458,3459],{},"and",[22,3461,3462,3464],{},[109,3463,3429],{},"__.",[35,3466,3468],{"id":3467},"example-look-up-countries","Example: Look Up Countries",[102,3470,3472],{"className":104,"code":3471,"language":106,"meta":107,"style":107},"GET /ads/{connection_id}/target?type=countries&query=united\n",[109,3473,3474],{"__ignoreMap":107},[112,3475,3476,3478,3481,3484,3486],{"class":114,"line":115},[112,3477,2712],{"class":118},[112,3479,3480],{"class":122}," /ads/{connection_id}/target?type=countries",[112,3482,3483],{"class":236},"&query",[112,3485,335],{"class":229},[112,3487,3488],{"class":122},"united\n",[19,3490,2718],{},[102,3492,3494],{"className":2318,"code":3493,"language":2320,"meta":107,"style":107},"[\n    { \"id\": \"US\", \"name\": \"United States\", \"value\": \"US\", \"type\": \"countries\" },\n    { \"id\": \"GB\", \"name\": \"United Kingdom\", \"value\": \"GB\", \"type\": \"countries\" }\n]\n",[109,3495,3496,3500,3540,3578],{"__ignoreMap":107},[112,3497,3498],{"class":114,"line":115},[112,3499,2728],{"class":236},[112,3501,3502,3504,3506,3508,3511,3513,3515,3517,3520,3522,3525,3527,3529,3531,3533,3535,3538],{"class":114,"line":126},[112,3503,2377],{"class":236},[112,3505,2380],{"class":129},[112,3507,2335],{"class":236},[112,3509,3510],{"class":122},"\"US\"",[112,3512,1046],{"class":236},[112,3514,2744],{"class":129},[112,3516,2335],{"class":236},[112,3518,3519],{"class":122},"\"United States\"",[112,3521,1046],{"class":236},[112,3523,3524],{"class":129},"\"value\"",[112,3526,2335],{"class":236},[112,3528,3510],{"class":122},[112,3530,1046],{"class":236},[112,3532,2390],{"class":129},[112,3534,2335],{"class":236},[112,3536,3537],{"class":122},"\"countries\"",[112,3539,378],{"class":236},[112,3541,3542,3544,3546,3548,3551,3553,3555,3557,3560,3562,3564,3566,3568,3570,3572,3574,3576],{"class":114,"line":135},[112,3543,2377],{"class":236},[112,3545,2380],{"class":129},[112,3547,2335],{"class":236},[112,3549,3550],{"class":122},"\"GB\"",[112,3552,1046],{"class":236},[112,3554,2744],{"class":129},[112,3556,2335],{"class":236},[112,3558,3559],{"class":122},"\"United Kingdom\"",[112,3561,1046],{"class":236},[112,3563,3524],{"class":129},[112,3565,2335],{"class":236},[112,3567,3550],{"class":122},[112,3569,1046],{"class":236},[112,3571,2390],{"class":129},[112,3573,2335],{"class":236},[112,3575,3537],{"class":122},[112,3577,2398],{"class":236},[112,3579,3580],{"class":114,"line":147},[112,3581,2794],{"class":236},[35,3583,3585],{"id":3584},"example-look-up-regions-eg-us-states","Example: Look Up Regions (e.g., US States)",[102,3587,3589],{"className":104,"code":3588,"language":106,"meta":107,"style":107},"GET /ads/{connection_id}/target?type=regions&query=california\n",[109,3590,3591],{"__ignoreMap":107},[112,3592,3593,3595,3598,3600,3602],{"class":114,"line":115},[112,3594,2712],{"class":118},[112,3596,3597],{"class":122}," /ads/{connection_id}/target?type=regions",[112,3599,3483],{"class":236},[112,3601,335],{"class":229},[112,3603,3604],{"class":122},"california\n",[19,3606,2718],{},[102,3608,3610],{"className":2318,"code":3609,"language":2320,"meta":107,"style":107},"[\n    { \"id\": \"3843\", \"name\": \"California\", \"value\": \"3843\", \"type\": \"regions\" }\n]\n",[109,3611,3612,3616,3655],{"__ignoreMap":107},[112,3613,3614],{"class":114,"line":115},[112,3615,2728],{"class":236},[112,3617,3618,3620,3622,3624,3627,3629,3631,3633,3636,3638,3640,3642,3644,3646,3648,3650,3653],{"class":114,"line":126},[112,3619,2377],{"class":236},[112,3621,2380],{"class":129},[112,3623,2335],{"class":236},[112,3625,3626],{"class":122},"\"3843\"",[112,3628,1046],{"class":236},[112,3630,2744],{"class":129},[112,3632,2335],{"class":236},[112,3634,3635],{"class":122},"\"California\"",[112,3637,1046],{"class":236},[112,3639,3524],{"class":129},[112,3641,2335],{"class":236},[112,3643,3626],{"class":122},[112,3645,1046],{"class":236},[112,3647,2390],{"class":129},[112,3649,2335],{"class":236},[112,3651,3652],{"class":122},"\"regions\"",[112,3654,2398],{"class":236},[112,3656,3657],{"class":114,"line":135},[112,3658,2794],{"class":236},[35,3660,3662],{"id":3661},"example-look-up-interests-meta-ads","Example: Look Up Interests (Meta Ads)",[102,3664,3666],{"className":104,"code":3665,"language":106,"meta":107,"style":107},"GET /ads/{connection_id}/target?type=interests&query=technology\n",[109,3667,3668],{"__ignoreMap":107},[112,3669,3670,3672,3675,3677,3679],{"class":114,"line":115},[112,3671,2712],{"class":118},[112,3673,3674],{"class":122}," /ads/{connection_id}/target?type=interests",[112,3676,3483],{"class":236},[112,3678,335],{"class":229},[112,3680,3681],{"class":122},"technology\n",[35,3683,3685],{"id":3684},"using-targeting-ids-when-creating-ads","Using Targeting IDs When Creating Ads",[19,3687,3688,3689,3691,3692,3695,3696,3698,3699,3701],{},"Pass the ",[109,3690,2442],{}," (or ",[109,3693,3694],{},"value",") from ",[109,3697,2055],{}," responses into the ",[109,3700,2064],{}," object. The structure matches the targeting type:",[72,3703,3704,3716,3732,3743],{},[46,3705,3706,2251,3709,3712,3713,610],{},[478,3707,3708],{},"Countries:",[109,3710,3711],{},"targeting.geographic.countries"," — array of ISO country codes (e.g., ",[109,3714,3715],{},"[\"US\", \"CA\"]",[46,3717,3718,2251,3721,3724,3725,3728,3729,3731],{},[478,3719,3720],{},"Regions:",[109,3722,3723],{},"targeting.geographic.regions"," — array of ",[109,3726,3727],{},"{ id, name? }"," (use ",[109,3730,2442],{}," from ads_target)",[46,3733,3734,2251,3737,3724,3740],{},[478,3735,3736],{},"Cities:",[109,3738,3739],{},"targeting.geographic.cities",[109,3741,3742],{},"{ id, name?, radius?, radius_unit? }",[46,3744,3745,2251,3748,3751],{},[478,3746,3747],{},"Demographics:",[109,3749,3750],{},"targeting.demographic"," — age and gender (no lookup needed; use values directly)",[16,3753],{},[67,3755,3757],{"id":3756},"targeting-examples","Targeting Examples",[35,3759,3761],{"id":3760},"geo-targeting-countries-and-regions","Geo-Targeting: Countries and Regions",[19,3763,3764],{},"First, look up IDs:",[102,3766,3768],{"className":104,"code":3767,"language":106,"meta":107,"style":107},"# Get country codes\nGET /ads/{connection_id}/target?type=countries&query=united\n\n# Get regions (e.g., states) — for regions, query often includes country context\nGET /ads/{connection_id}/target?type=regions&query=california\n",[109,3769,3770,3775,3787,3791,3796],{"__ignoreMap":107},[112,3771,3772],{"class":114,"line":115},[112,3773,3774],{"class":578},"# Get country codes\n",[112,3776,3777,3779,3781,3783,3785],{"class":114,"line":126},[112,3778,2712],{"class":118},[112,3780,3480],{"class":122},[112,3782,3483],{"class":236},[112,3784,335],{"class":229},[112,3786,3488],{"class":122},[112,3788,3789],{"class":114,"line":135},[112,3790,272],{"emptyLinePlaceholder":271},[112,3792,3793],{"class":114,"line":147},[112,3794,3795],{"class":578},"# Get regions (e.g., states) — for regions, query often includes country context\n",[112,3797,3798,3800,3802,3804,3806],{"class":114,"line":202},[112,3799,2712],{"class":118},[112,3801,3597],{"class":122},[112,3803,3483],{"class":236},[112,3805,335],{"class":229},[112,3807,3604],{"class":122},[19,3809,3810],{},"Then create an ad group with geographic targeting:",[102,3812,3814],{"className":2318,"code":3813,"language":2320,"meta":107,"style":107},"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"US & California Ad Group\",\n  \"promoted\": [{ \"id\": \"789\", \"type\": \"PAGE_ID\" }],\n  \"targeting\": {\n    \"geographic\": {\n      \"countries\": [\"US\"],\n      \"regions\": [\n        { \"id\": \"3843\", \"name\": \"California\" }\n      ]\n    }\n  }\n}\n",[109,3815,3816,3824,3828,3838,3848,3859,3881,3889,3896,3909,3916,3937,3942,3947,3951],{"__ignoreMap":107},[112,3817,3818,3820,3822],{"class":114,"line":115},[112,3819,2882],{"class":236},[112,3821,2886],{"class":2885},[112,3823,2889],{"class":236},[112,3825,3826],{"class":114,"line":126},[112,3827,2327],{"class":236},[112,3829,3830,3832,3834,3836],{"class":114,"line":135},[112,3831,2332],{"class":129},[112,3833,2335],{"class":236},[112,3835,2338],{"class":122},[112,3837,288],{"class":236},[112,3839,3840,3842,3844,3846],{"class":114,"line":147},[112,3841,2345],{"class":129},[112,3843,2335],{"class":236},[112,3845,2350],{"class":122},[112,3847,288],{"class":236},[112,3849,3850,3852,3854,3857],{"class":114,"line":202},[112,3851,2357],{"class":129},[112,3853,2335],{"class":236},[112,3855,3856],{"class":122},"\"US & California Ad Group\"",[112,3858,288],{"class":236},[112,3860,3861,3863,3865,3867,3869,3871,3873,3875,3877,3879],{"class":114,"line":208},[112,3862,2369],{"class":129},[112,3864,2930],{"class":236},[112,3866,2380],{"class":129},[112,3868,2335],{"class":236},[112,3870,2385],{"class":122},[112,3872,1046],{"class":236},[112,3874,2390],{"class":129},[112,3876,2335],{"class":236},[112,3878,2395],{"class":122},[112,3880,1234],{"class":236},[112,3882,3883,3886],{"class":114,"line":291},[112,3884,3885],{"class":129},"  \"targeting\"",[112,3887,3888],{"class":236},": {\n",[112,3890,3891,3894],{"class":114,"line":299},[112,3892,3893],{"class":129},"    \"geographic\"",[112,3895,3888],{"class":236},[112,3897,3898,3901,3904,3906],{"class":114,"line":307},[112,3899,3900],{"class":129},"      \"countries\"",[112,3902,3903],{"class":236},": [",[112,3905,3510],{"class":122},[112,3907,3908],{"class":236},"],\n",[112,3910,3911,3914],{"class":114,"line":315},[112,3912,3913],{"class":129},"      \"regions\"",[112,3915,2372],{"class":236},[112,3917,3918,3921,3923,3925,3927,3929,3931,3933,3935],{"class":114,"line":323},[112,3919,3920],{"class":236},"        { ",[112,3922,2380],{"class":129},[112,3924,2335],{"class":236},[112,3926,3626],{"class":122},[112,3928,1046],{"class":236},[112,3930,2744],{"class":129},[112,3932,2335],{"class":236},[112,3934,3635],{"class":122},[112,3936,2398],{"class":236},[112,3938,3939],{"class":114,"line":329},[112,3940,3941],{"class":236},"      ]\n",[112,3943,3944],{"class":114,"line":341},[112,3945,3946],{"class":236},"    }\n",[112,3948,3949],{"class":114,"line":346},[112,3950,1476],{"class":236},[112,3952,3953],{"class":114,"line":366},[112,3954,584],{"class":236},[35,3956,3958],{"id":3957},"geo-targeting-cities-with-radius","Geo-Targeting: Cities with Radius",[102,3960,3962],{"className":2318,"code":3961,"language":2320,"meta":107,"style":107},"{\n  \"targeting\": {\n    \"geographic\": {\n      \"countries\": [\"US\"],\n      \"cities\": [\n        {\n          \"id\": \"2420379\",\n          \"name\": \"San Francisco\",\n          \"radius\": 25,\n          \"radius_unit\": \"MILES\"\n        }\n      ]\n    }\n  }\n}\n",[109,3963,3964,3968,3974,3980,3990,3997,4002,4014,4026,4038,4048,4053,4057,4061,4065],{"__ignoreMap":107},[112,3965,3966],{"class":114,"line":115},[112,3967,2327],{"class":236},[112,3969,3970,3972],{"class":114,"line":126},[112,3971,3885],{"class":129},[112,3973,3888],{"class":236},[112,3975,3976,3978],{"class":114,"line":135},[112,3977,3893],{"class":129},[112,3979,3888],{"class":236},[112,3981,3982,3984,3986,3988],{"class":114,"line":147},[112,3983,3900],{"class":129},[112,3985,3903],{"class":236},[112,3987,3510],{"class":122},[112,3989,3908],{"class":236},[112,3991,3992,3995],{"class":114,"line":202},[112,3993,3994],{"class":129},"      \"cities\"",[112,3996,2372],{"class":236},[112,3998,3999],{"class":114,"line":208},[112,4000,4001],{"class":236},"        {\n",[112,4003,4004,4007,4009,4012],{"class":114,"line":291},[112,4005,4006],{"class":129},"          \"id\"",[112,4008,2335],{"class":236},[112,4010,4011],{"class":122},"\"2420379\"",[112,4013,288],{"class":236},[112,4015,4016,4019,4021,4024],{"class":114,"line":299},[112,4017,4018],{"class":129},"          \"name\"",[112,4020,2335],{"class":236},[112,4022,4023],{"class":122},"\"San Francisco\"",[112,4025,288],{"class":236},[112,4027,4028,4031,4033,4036],{"class":114,"line":307},[112,4029,4030],{"class":129},"          \"radius\"",[112,4032,2335],{"class":236},[112,4034,4035],{"class":129},"25",[112,4037,288],{"class":236},[112,4039,4040,4043,4045],{"class":114,"line":315},[112,4041,4042],{"class":129},"          \"radius_unit\"",[112,4044,2335],{"class":236},[112,4046,4047],{"class":122},"\"MILES\"\n",[112,4049,4050],{"class":114,"line":323},[112,4051,4052],{"class":236},"        }\n",[112,4054,4055],{"class":114,"line":329},[112,4056,3941],{"class":236},[112,4058,4059],{"class":114,"line":341},[112,4060,3946],{"class":236},[112,4062,4063],{"class":114,"line":346},[112,4064,1476],{"class":236},[112,4066,4067],{"class":114,"line":366},[112,4068,584],{"class":236},[35,4070,4072],{"id":4071},"demographic-targeting","Demographic Targeting",[19,4074,4075,4076,4078],{},"Demographic targeting uses simple values; no ",[109,4077,2055],{}," lookup is needed:",[102,4080,4082],{"className":2318,"code":4081,"language":2320,"meta":107,"style":107},"{\n  \"targeting\": {\n    \"demographic\": {\n      \"age_min\": 25,\n      \"age_max\": 54,\n      \"male\": true,\n      \"female\": true\n    }\n  }\n}\n",[109,4083,4084,4088,4094,4101,4112,4124,4135,4145,4149,4153],{"__ignoreMap":107},[112,4085,4086],{"class":114,"line":115},[112,4087,2327],{"class":236},[112,4089,4090,4092],{"class":114,"line":126},[112,4091,3885],{"class":129},[112,4093,3888],{"class":236},[112,4095,4096,4099],{"class":114,"line":135},[112,4097,4098],{"class":129},"    \"demographic\"",[112,4100,3888],{"class":236},[112,4102,4103,4106,4108,4110],{"class":114,"line":147},[112,4104,4105],{"class":129},"      \"age_min\"",[112,4107,2335],{"class":236},[112,4109,4035],{"class":129},[112,4111,288],{"class":236},[112,4113,4114,4117,4119,4122],{"class":114,"line":202},[112,4115,4116],{"class":129},"      \"age_max\"",[112,4118,2335],{"class":236},[112,4120,4121],{"class":129},"54",[112,4123,288],{"class":236},[112,4125,4126,4129,4131,4133],{"class":114,"line":208},[112,4127,4128],{"class":129},"      \"male\"",[112,4130,2335],{"class":236},[112,4132,1340],{"class":129},[112,4134,288],{"class":236},[112,4136,4137,4140,4142],{"class":114,"line":291},[112,4138,4139],{"class":129},"      \"female\"",[112,4141,2335],{"class":236},[112,4143,4144],{"class":129},"true\n",[112,4146,4147],{"class":114,"line":299},[112,4148,3946],{"class":236},[112,4150,4151],{"class":114,"line":307},[112,4152,1476],{"class":236},[112,4154,4155],{"class":114,"line":315},[112,4156,584],{"class":236},[72,4158,4159,4169],{},[46,4160,4161,4164,4165,4168],{},[109,4162,4163],{},"age_min"," / ",[109,4166,4167],{},"age_max",": 18–65 typically",[46,4170,4171,4164,4174,2335,4177,4179,4180,4183],{},[109,4172,4173],{},"male",[109,4175,4176],{},"female",[109,4178,1340],{}," to include, ",[109,4181,4182],{},"false"," or omit to exclude",[35,4185,4187],{"id":4186},"combined-geo-demographic-targeting","Combined Geo + Demographic Targeting",[102,4189,4191],{"className":2318,"code":4190,"language":2320,"meta":107,"style":107},"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"US Adults 25-54\",\n  \"promoted\": [{ \"id\": \"789\", \"type\": \"PAGE_ID\" }],\n  \"targeting\": {\n    \"geographic\": {\n      \"countries\": [\"US\"]\n    },\n    \"demographic\": {\n      \"age_min\": 25,\n      \"age_max\": 54,\n      \"male\": true,\n      \"female\": true\n    }\n  }\n}\n",[109,4192,4193,4201,4205,4215,4225,4236,4258,4264,4270,4280,4284,4290,4300,4310,4320,4328,4332,4336],{"__ignoreMap":107},[112,4194,4195,4197,4199],{"class":114,"line":115},[112,4196,2882],{"class":236},[112,4198,2886],{"class":2885},[112,4200,2889],{"class":236},[112,4202,4203],{"class":114,"line":126},[112,4204,2327],{"class":236},[112,4206,4207,4209,4211,4213],{"class":114,"line":135},[112,4208,2332],{"class":129},[112,4210,2335],{"class":236},[112,4212,2338],{"class":122},[112,4214,288],{"class":236},[112,4216,4217,4219,4221,4223],{"class":114,"line":147},[112,4218,2345],{"class":129},[112,4220,2335],{"class":236},[112,4222,2350],{"class":122},[112,4224,288],{"class":236},[112,4226,4227,4229,4231,4234],{"class":114,"line":202},[112,4228,2357],{"class":129},[112,4230,2335],{"class":236},[112,4232,4233],{"class":122},"\"US Adults 25-54\"",[112,4235,288],{"class":236},[112,4237,4238,4240,4242,4244,4246,4248,4250,4252,4254,4256],{"class":114,"line":208},[112,4239,2369],{"class":129},[112,4241,2930],{"class":236},[112,4243,2380],{"class":129},[112,4245,2335],{"class":236},[112,4247,2385],{"class":122},[112,4249,1046],{"class":236},[112,4251,2390],{"class":129},[112,4253,2335],{"class":236},[112,4255,2395],{"class":122},[112,4257,1234],{"class":236},[112,4259,4260,4262],{"class":114,"line":291},[112,4261,3885],{"class":129},[112,4263,3888],{"class":236},[112,4265,4266,4268],{"class":114,"line":299},[112,4267,3893],{"class":129},[112,4269,3888],{"class":236},[112,4271,4272,4274,4276,4278],{"class":114,"line":307},[112,4273,3900],{"class":129},[112,4275,3903],{"class":236},[112,4277,3510],{"class":122},[112,4279,2794],{"class":236},[112,4281,4282],{"class":114,"line":315},[112,4283,988],{"class":236},[112,4285,4286,4288],{"class":114,"line":323},[112,4287,4098],{"class":129},[112,4289,3888],{"class":236},[112,4291,4292,4294,4296,4298],{"class":114,"line":329},[112,4293,4105],{"class":129},[112,4295,2335],{"class":236},[112,4297,4035],{"class":129},[112,4299,288],{"class":236},[112,4301,4302,4304,4306,4308],{"class":114,"line":341},[112,4303,4116],{"class":129},[112,4305,2335],{"class":236},[112,4307,4121],{"class":129},[112,4309,288],{"class":236},[112,4311,4312,4314,4316,4318],{"class":114,"line":346},[112,4313,4128],{"class":129},[112,4315,2335],{"class":236},[112,4317,1340],{"class":129},[112,4319,288],{"class":236},[112,4321,4322,4324,4326],{"class":114,"line":366},[112,4323,4139],{"class":129},[112,4325,2335],{"class":236},[112,4327,4144],{"class":129},[112,4329,4330],{"class":114,"line":381},[112,4331,3946],{"class":236},[112,4333,4334],{"class":114,"line":387},[112,4335,1476],{"class":236},[112,4337,4338],{"class":114,"line":392},[112,4339,584],{"class":236},[35,4341,4343],{"id":4342},"audience-targeting-interests-custom-audiences","Audience Targeting (Interests, Custom Audiences)",[19,4345,4346],{},"For interests and custom audiences, look up IDs first:",[102,4348,4350],{"className":104,"code":4349,"language":106,"meta":107,"style":107},"GET /ads/{connection_id}/target?type=interests&query=technology\nGET /ads/{connection_id}/target?type=user_lists&query=my&org_id=act_123\n",[109,4351,4352,4364],{"__ignoreMap":107},[112,4353,4354,4356,4358,4360,4362],{"class":114,"line":115},[112,4355,2712],{"class":118},[112,4357,3674],{"class":122},[112,4359,3483],{"class":236},[112,4361,335],{"class":229},[112,4363,3681],{"class":122},[112,4365,4366,4368,4371,4373,4375,4378,4381,4383],{"class":114,"line":126},[112,4367,2712],{"class":118},[112,4369,4370],{"class":122}," /ads/{connection_id}/target?type=user_lists",[112,4372,3483],{"class":236},[112,4374,335],{"class":229},[112,4376,4377],{"class":122},"my",[112,4379,4380],{"class":236},"&org_id",[112,4382,335],{"class":229},[112,4384,4385],{"class":122},"act_123\n",[19,4387,4388,4389,4391,4392,171],{},"Then use the ",[109,4390,2442],{}," values in ",[109,4393,4394],{},"targeting.audience",[102,4396,4398],{"className":2318,"code":4397,"language":2320,"meta":107,"style":107},"{\n  \"targeting\": {\n    \"audience\": {\n      \"interests\": [\n        { \"id\": \"600313926646746\", \"name\": \"Technology\" }\n      ],\n      \"custom_audiences\": [\n        { \"id\": \"12345678\", \"name\": \"My Custom Audience\" }\n      ]\n    }\n  }\n}\n",[109,4399,4400,4404,4410,4417,4424,4446,4451,4458,4480,4484,4488,4492],{"__ignoreMap":107},[112,4401,4402],{"class":114,"line":115},[112,4403,2327],{"class":236},[112,4405,4406,4408],{"class":114,"line":126},[112,4407,3885],{"class":129},[112,4409,3888],{"class":236},[112,4411,4412,4415],{"class":114,"line":135},[112,4413,4414],{"class":129},"    \"audience\"",[112,4416,3888],{"class":236},[112,4418,4419,4422],{"class":114,"line":147},[112,4420,4421],{"class":129},"      \"interests\"",[112,4423,2372],{"class":236},[112,4425,4426,4428,4430,4432,4435,4437,4439,4441,4444],{"class":114,"line":202},[112,4427,3920],{"class":236},[112,4429,2380],{"class":129},[112,4431,2335],{"class":236},[112,4433,4434],{"class":122},"\"600313926646746\"",[112,4436,1046],{"class":236},[112,4438,2744],{"class":129},[112,4440,2335],{"class":236},[112,4442,4443],{"class":122},"\"Technology\"",[112,4445,2398],{"class":236},[112,4447,4448],{"class":114,"line":208},[112,4449,4450],{"class":236},"      ],\n",[112,4452,4453,4456],{"class":114,"line":291},[112,4454,4455],{"class":129},"      \"custom_audiences\"",[112,4457,2372],{"class":236},[112,4459,4460,4462,4464,4466,4469,4471,4473,4475,4478],{"class":114,"line":299},[112,4461,3920],{"class":236},[112,4463,2380],{"class":129},[112,4465,2335],{"class":236},[112,4467,4468],{"class":122},"\"12345678\"",[112,4470,1046],{"class":236},[112,4472,2744],{"class":129},[112,4474,2335],{"class":236},[112,4476,4477],{"class":122},"\"My Custom Audience\"",[112,4479,2398],{"class":236},[112,4481,4482],{"class":114,"line":307},[112,4483,3941],{"class":236},[112,4485,4486],{"class":114,"line":315},[112,4487,3946],{"class":236},[112,4489,4490],{"class":114,"line":323},[112,4491,1476],{"class":236},[112,4493,4494],{"class":114,"line":329},[112,4495,584],{"class":236},[16,4497],{},[1558,4499,4500],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":107,"searchDepth":126,"depth":126,"links":4502},[4503,4504,4505,4506,4507,4508,4509,4512,4518,4525,4532],{"id":1837,"depth":135,"text":1838},{"id":1971,"depth":135,"text":1972},{"id":2032,"depth":135,"text":2033},{"id":2085,"depth":135,"text":2086},{"id":2116,"depth":135,"text":2117},{"id":2239,"depth":135,"text":2240},{"id":2412,"depth":126,"text":2413,"children":4510},[4511],{"id":2482,"depth":135,"text":2483},{"id":2600,"depth":126,"text":2601,"children":4513},[4514,4515,4516,4517],{"id":2701,"depth":135,"text":2702},{"id":2797,"depth":135,"text":2798},{"id":2813,"depth":135,"text":2814},{"id":2846,"depth":135,"text":2847},{"id":2867,"depth":126,"text":2868,"children":4519},[4520,4521,4522,4523,4524],{"id":2871,"depth":135,"text":2872},{"id":2954,"depth":135,"text":2955},{"id":3047,"depth":135,"text":3048},{"id":3129,"depth":135,"text":3130},{"id":3210,"depth":135,"text":3211},{"id":3291,"depth":126,"text":3292,"children":4526},[4527,4528,4529,4530,4531],{"id":3304,"depth":135,"text":3305},{"id":3467,"depth":135,"text":3468},{"id":3584,"depth":135,"text":3585},{"id":3661,"depth":135,"text":3662},{"id":3684,"depth":135,"text":3685},{"id":3756,"depth":126,"text":3757,"children":4533},[4534,4535,4536,4537,4538],{"id":3760,"depth":135,"text":3761},{"id":3957,"depth":135,"text":3958},{"id":4071,"depth":135,"text":4072},{"id":4186,"depth":135,"text":4187},{"id":4342,"depth":135,"text":4343},"The Unified API Ads category models advertising structures across Meta, Google, Amazon, Twitter, LinkedIn, and other providers. Understanding how objects...",{"img":4541,"date":4542,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/creating_ads_using_the_unified_ads_api-icon.png","2026-03-14T23:39:00.000Z","/guides/creating_ads_using_the_unified_ads_api",{"title":1815,"description":4539},"guides/creating_ads_using_the_unified_ads_api","zCmMg9wP45p4g4D6_c1u3_1UWbr_n5QTJlC5xr8KFRI",{"id":4548,"title":4549,"body":4550,"description":9657,"extension":1576,"meta":9658,"navigation":271,"path":9661,"seo":9662,"stem":9663,"__hash__":9664},"guides/guides/creating_walmart_items_via_unified.md","Creating Walmart Items via Unified",{"type":9,"value":4551,"toc":9646},[4552,4555,4557,4562,4577,4579,4583,4638,4640,4644,4650,4688,4694,5070,5073,5075,5082,8883,8885,8889,8895,8902,8904,8908,9527,9553,9566,9583,9587,9621,9625,9628,9643],[12,4553,4549],{"id":4554},"creating-walmart-items-via-unified",[16,4556],{},[19,4558,4559],{},[22,4560,4561],{},"July 31, 2025",[19,4563,4564,4565,4568,4569,4572,4573,4576],{},"Unified allows you to create structured product listings on ",[478,4566,4567],{},"Walmart Marketplace"," via our Unified data model ",[109,4570,4571],{},"commerce_item",". This guide explains the ",[478,4574,4575],{},"critical fields"," you must understand and provide correctly:",[16,4578],{},[35,4580,4582],{"id":4581},"key-concepts","🧩 Key Concepts",[1868,4584,4585,4593],{},[1871,4586,4587],{},[1874,4588,4589,4591],{},[1877,4590,2425],{},[1877,4592,1882],{},[1890,4594,4595,4608,4625],{},[1874,4596,4597,4601],{},[1895,4598,4599],{},[109,4600,2472],{},[1895,4602,4603,4604,4607],{},"This specifies the ",[478,4605,4606],{},"Walmart subcategory"," your item belongs to. It determines what metadata is required. Must be one of the supported 76 categories (see below).",[1874,4609,4610,4615],{},[1895,4611,4612],{},[109,4613,4614],{},"global_code",[1895,4616,4617,4618,4621,4622,634],{},"This is your product's ",[478,4619,4620],{},"GTIN"," (Global Trade Item Number), a required identifier for Walmart. It must be a ",[478,4623,4624],{},"valid 12–14 digit string",[1874,4626,4627,4632],{},[1895,4628,4629],{},[109,4630,4631],{},"metadata",[1895,4633,4634,4635,4637],{},"A dynamic array of key-value attributes that depends on the selected ",[109,4636,2472],{},". This is how you provide structured product details like color, material, warranty, etc.",[16,4639],{},[35,4641,4643],{"id":4642},"how-metadata-works","🧠 How Metadata Works",[19,4645,4646,4647,4649],{},"Each ",[109,4648,2472],{}," (subcategory) has a corresponding schema of fields allowed by Walmart. For example:",[72,4651,4652,4671],{},[46,4653,4654,4657,4658,1046,4661,1046,4664,1046,4667,4670],{},[109,4655,4656],{},"animal_accessories"," allows fields like ",[109,4659,4660],{},"animalType",[109,4662,4663],{},"petSize",[109,4665,4666],{},"isFoldable",[109,4668,4669],{},"colorCategory",", etc.",[46,4672,4673,4657,4676,1046,4679,1046,4682,1046,4685,4670],{},[109,4674,4675],{},"computers",[109,4677,4678],{},"processorType",[109,4680,4681],{},"screenSize",[109,4683,4684],{},"ramMemory",[109,4686,4687],{},"operatingSystem",[19,4689,4690,4693],{},[478,4691,4692],{},"List the metadata fields from Unified"," using this API",[102,4695,4697],{"className":220,"code":4696,"language":222,"meta":107,"style":107},"GET /metadata_metadata?type=commerce_item\n\n[\n        {\n            \"id\": \"shortDescription\",\n            \"name\": \"shortDescription\",\n            \"slug\": \"shortDescription\",\n            \"format\": \"TEXT\",\n            \"original_format\": \"string\",\n            \"object_type\": \"commerce_item\"\n        },\n        {\n            \"id\": \"minimumRecommendedAge\",\n            \"name\": \"minimumRecommendedAge\",\n            \"slug\": \"minimumRecommendedAge\",\n            \"format\": \"MEASUREMENT\",\n            \"original_format\": \"{\\\"measure\\\":\\\"number\\\",\\\"unit\\\":[\\\"months\\\",\\\"years\\\"]}\",\n            \"object_type\": \"commerce_item\"\n        },\n        {\n            \"id\": \"smallPartsWarnings\",\n            \"name\": \"Small Parts Warning Code\",\n            \"slug\": \"smallPartsWarnings\",\n            \"format\": \"MULTIPLE_SELECT\",\n            \"original_format\": \"string[]\",\n            \"options\": [\n                \"0 - No warning applicable\",\n                \"5 - Choking hazard is a marble\",\n                \"4 - Choking hazard balloon\",\n                \"6 - Choking hazard contains a marble\",\n                \"2 - Choking hazard contains small ball\",\n                \"3 - Choking hazard contains small parts\",\n                \"1 - Choking hazard is a small ball\"\n            ],\n            \"object_type\": \"commerce_item\"\n        },\n ]\n",[109,4698,4699,4719,4723,4727,4731,4743,4754,4765,4777,4789,4799,4804,4808,4819,4829,4839,4850,4909,4917,4921,4925,4936,4947,4958,4970,4982,4990,4998,5006,5014,5022,5030,5038,5044,5050,5059,5064],{"__ignoreMap":107},[112,4700,4701,4703,4706,4709,4712,4714,4716],{"class":114,"line":115},[112,4702,2712],{"class":129},[112,4704,4705],{"class":229}," /",[112,4707,4708],{"class":236},"metadata_metadata",[112,4710,4711],{"class":229},"?",[112,4713,2472],{"class":236},[112,4715,335],{"class":229},[112,4717,4718],{"class":236},"commerce_item\n",[112,4720,4721],{"class":114,"line":126},[112,4722,272],{"emptyLinePlaceholder":271},[112,4724,4725],{"class":114,"line":135},[112,4726,2728],{"class":236},[112,4728,4729],{"class":114,"line":147},[112,4730,4001],{"class":236},[112,4732,4733,4736,4738,4741],{"class":114,"line":202},[112,4734,4735],{"class":122},"            \"id\"",[112,4737,2335],{"class":236},[112,4739,4740],{"class":122},"\"shortDescription\"",[112,4742,288],{"class":236},[112,4744,4745,4748,4750,4752],{"class":114,"line":208},[112,4746,4747],{"class":122},"            \"name\"",[112,4749,2335],{"class":236},[112,4751,4740],{"class":122},[112,4753,288],{"class":236},[112,4755,4756,4759,4761,4763],{"class":114,"line":291},[112,4757,4758],{"class":122},"            \"slug\"",[112,4760,2335],{"class":236},[112,4762,4740],{"class":122},[112,4764,288],{"class":236},[112,4766,4767,4770,4772,4775],{"class":114,"line":299},[112,4768,4769],{"class":122},"            \"format\"",[112,4771,2335],{"class":236},[112,4773,4774],{"class":122},"\"TEXT\"",[112,4776,288],{"class":236},[112,4778,4779,4782,4784,4787],{"class":114,"line":307},[112,4780,4781],{"class":122},"            \"original_format\"",[112,4783,2335],{"class":236},[112,4785,4786],{"class":122},"\"string\"",[112,4788,288],{"class":236},[112,4790,4791,4794,4796],{"class":114,"line":315},[112,4792,4793],{"class":122},"            \"object_type\"",[112,4795,2335],{"class":236},[112,4797,4798],{"class":122},"\"commerce_item\"\n",[112,4800,4801],{"class":114,"line":323},[112,4802,4803],{"class":236},"        },\n",[112,4805,4806],{"class":114,"line":329},[112,4807,4001],{"class":236},[112,4809,4810,4812,4814,4817],{"class":114,"line":341},[112,4811,4735],{"class":122},[112,4813,2335],{"class":236},[112,4815,4816],{"class":122},"\"minimumRecommendedAge\"",[112,4818,288],{"class":236},[112,4820,4821,4823,4825,4827],{"class":114,"line":346},[112,4822,4747],{"class":122},[112,4824,2335],{"class":236},[112,4826,4816],{"class":122},[112,4828,288],{"class":236},[112,4830,4831,4833,4835,4837],{"class":114,"line":366},[112,4832,4758],{"class":122},[112,4834,2335],{"class":236},[112,4836,4816],{"class":122},[112,4838,288],{"class":236},[112,4840,4841,4843,4845,4848],{"class":114,"line":381},[112,4842,4769],{"class":122},[112,4844,2335],{"class":236},[112,4846,4847],{"class":122},"\"MEASUREMENT\"",[112,4849,288],{"class":236},[112,4851,4852,4854,4856,4859,4862,4865,4867,4869,4871,4873,4875,4878,4880,4883,4885,4888,4890,4893,4895,4897,4899,4902,4904,4907],{"class":114,"line":387},[112,4853,4781],{"class":122},[112,4855,2335],{"class":236},[112,4857,4858],{"class":122},"\"{",[112,4860,4861],{"class":129},"\\\"",[112,4863,4864],{"class":122},"measure",[112,4866,4861],{"class":129},[112,4868,171],{"class":122},[112,4870,4861],{"class":129},[112,4872,2683],{"class":122},[112,4874,4861],{"class":129},[112,4876,4877],{"class":122},",",[112,4879,4861],{"class":129},[112,4881,4882],{"class":122},"unit",[112,4884,4861],{"class":129},[112,4886,4887],{"class":122},":[",[112,4889,4861],{"class":129},[112,4891,4892],{"class":122},"months",[112,4894,4861],{"class":129},[112,4896,4877],{"class":122},[112,4898,4861],{"class":129},[112,4900,4901],{"class":122},"years",[112,4903,4861],{"class":129},[112,4905,4906],{"class":122},"]}\"",[112,4908,288],{"class":236},[112,4910,4911,4913,4915],{"class":114,"line":392},[112,4912,4793],{"class":122},[112,4914,2335],{"class":236},[112,4916,4798],{"class":122},[112,4918,4919],{"class":114,"line":409},[112,4920,4803],{"class":236},[112,4922,4923],{"class":114,"line":422},[112,4924,4001],{"class":236},[112,4926,4927,4929,4931,4934],{"class":114,"line":435},[112,4928,4735],{"class":122},[112,4930,2335],{"class":236},[112,4932,4933],{"class":122},"\"smallPartsWarnings\"",[112,4935,288],{"class":236},[112,4937,4938,4940,4942,4945],{"class":114,"line":440},[112,4939,4747],{"class":122},[112,4941,2335],{"class":236},[112,4943,4944],{"class":122},"\"Small Parts Warning Code\"",[112,4946,288],{"class":236},[112,4948,4950,4952,4954,4956],{"class":114,"line":4949},23,[112,4951,4758],{"class":122},[112,4953,2335],{"class":236},[112,4955,4933],{"class":122},[112,4957,288],{"class":236},[112,4959,4961,4963,4965,4968],{"class":114,"line":4960},24,[112,4962,4769],{"class":122},[112,4964,2335],{"class":236},[112,4966,4967],{"class":122},"\"MULTIPLE_SELECT\"",[112,4969,288],{"class":236},[112,4971,4973,4975,4977,4980],{"class":114,"line":4972},25,[112,4974,4781],{"class":122},[112,4976,2335],{"class":236},[112,4978,4979],{"class":122},"\"string[]\"",[112,4981,288],{"class":236},[112,4983,4985,4988],{"class":114,"line":4984},26,[112,4986,4987],{"class":122},"            \"options\"",[112,4989,2372],{"class":236},[112,4991,4993,4996],{"class":114,"line":4992},27,[112,4994,4995],{"class":122},"                \"0 - No warning applicable\"",[112,4997,288],{"class":236},[112,4999,5001,5004],{"class":114,"line":5000},28,[112,5002,5003],{"class":122},"                \"5 - Choking hazard is a marble\"",[112,5005,288],{"class":236},[112,5007,5009,5012],{"class":114,"line":5008},29,[112,5010,5011],{"class":122},"                \"4 - Choking hazard balloon\"",[112,5013,288],{"class":236},[112,5015,5017,5020],{"class":114,"line":5016},30,[112,5018,5019],{"class":122},"                \"6 - Choking hazard contains a marble\"",[112,5021,288],{"class":236},[112,5023,5025,5028],{"class":114,"line":5024},31,[112,5026,5027],{"class":122},"                \"2 - Choking hazard contains small ball\"",[112,5029,288],{"class":236},[112,5031,5033,5036],{"class":114,"line":5032},32,[112,5034,5035],{"class":122},"                \"3 - Choking hazard contains small parts\"",[112,5037,288],{"class":236},[112,5039,5041],{"class":114,"line":5040},33,[112,5042,5043],{"class":122},"                \"1 - Choking hazard is a small ball\"\n",[112,5045,5047],{"class":114,"line":5046},34,[112,5048,5049],{"class":236},"            ],\n",[112,5051,5053,5055,5057],{"class":114,"line":5052},35,[112,5054,4793],{"class":122},[112,5056,2335],{"class":236},[112,5058,4798],{"class":122},[112,5060,5062],{"class":114,"line":5061},36,[112,5063,4803],{"class":236},[112,5065,5067],{"class":114,"line":5066},37,[112,5068,5069],{"class":236}," ]\n",[19,5071,5072],{},"You can filter these results by inspecting the supported pagination options.",[16,5074],{},[35,5076,5078,5079,5081],{"id":5077},"supported-type-values-for-walmart-items-commerce_item","Supported ",[109,5080,2472],{}," Values for Walmart Items (commerce_item)",[72,5083,5084,5089,5094,5099,5104,5109,5114,5119,5124,5129,5134,5139,5144,5149,5154,5159,5164,5169,5174,5179,5184,5189,5194,5199,5204,5209,5214,5219,5224,5229,5234,5239,5244,5249,5254,5259,5264,5269,5274,5279,5284,5289,5294,5299,5304,5309,5314,5319,5324,5329,5334,5339,5344,5349,5354,5359,5364,5369,5374,5379,5384,5389,5394,5399,5404,5409,5414,5419,5424,5429,5434,5439,5444,5449,5454,5459,5464,5469,5474,5479,5484,5489,5494,5499,5504,5509,5514,5519,5524,5529,5534,5539,5544,5549,5554,5559,5564,5569,5574,5579,5584,5589,5594,5599,5604,5609,5614,5619,5624,5629,5634,5639,5644,5649,5654,5659,5664,5669,5674,5679,5684,5689,5694,5699,5704,5709,5714,5719,5724,5729,5734,5739,5744,5749,5754,5759,5764,5769,5774,5779,5784,5789,5794,5799,5804,5809,5814,5819,5824,5829,5834,5839,5844,5849,5854,5859,5864,5869,5874,5879,5884,5889,5894,5899,5903,5908,5913,5918,5923,5928,5933,5938,5943,5948,5953,5958,5963,5968,5973,5978,5983,5988,5993,5998,6003,6008,6013,6018,6023,6028,6033,6038,6043,6048,6053,6058,6063,6068,6073,6078,6083,6088,6093,6098,6103,6108,6113,6118,6123,6128,6133,6138,6143,6148,6153,6158,6163,6168,6173,6178,6183,6188,6193,6198,6203,6208,6213,6218,6223,6228,6233,6238,6243,6248,6253,6258,6263,6268,6273,6278,6283,6288,6293,6298,6303,6308,6313,6318,6323,6328,6333,6338,6343,6348,6353,6358,6363,6368,6373,6378,6383,6388,6393,6398,6403,6408,6413,6418,6423,6428,6433,6438,6443,6448,6453,6458,6463,6468,6473,6478,6483,6488,6493,6498,6503,6508,6513,6518,6523,6528,6533,6538,6543,6548,6553,6558,6563,6568,6573,6578,6583,6588,6593,6598,6603,6608,6613,6618,6623,6628,6633,6638,6643,6648,6653,6658,6663,6668,6673,6678,6683,6688,6693,6698,6703,6708,6713,6718,6723,6728,6733,6738,6743,6748,6753,6758,6763,6768,6773,6778,6783,6788,6793,6798,6803,6808,6813,6818,6823,6828,6833,6838,6843,6848,6853,6858,6863,6868,6873,6878,6883,6888,6893,6898,6903,6908,6913,6918,6923,6928,6933,6938,6943,6948,6953,6958,6963,6968,6973,6978,6983,6988,6993,6998,7003,7008,7013,7018,7023,7028,7033,7038,7043,7048,7053,7058,7063,7068,7073,7078,7083,7088,7093,7098,7103,7108,7113,7118,7123,7128,7133,7138,7143,7148,7153,7158,7163,7168,7173,7178,7183,7188,7193,7198,7203,7208,7213,7218,7223,7228,7233,7238,7243,7248,7253,7258,7263,7268,7273,7278,7283,7288,7293,7298,7303,7308,7313,7318,7323,7328,7333,7338,7343,7348,7353,7358,7363,7368,7373,7378,7383,7388,7393,7398,7403,7408,7413,7418,7423,7428,7433,7438,7443,7448,7453,7458,7463,7468,7473,7478,7483,7488,7493,7498,7503,7508,7513,7518,7523,7528,7533,7538,7543,7548,7553,7558,7563,7568,7573,7578,7583,7588,7593,7598,7603,7608,7613,7618,7623,7628,7633,7638,7643,7648,7653,7658,7663,7668,7673,7678,7683,7688,7693,7698,7703,7708,7713,7718,7723,7728,7733,7738,7743,7748,7753,7758,7763,7768,7773,7778,7783,7788,7793,7798,7803,7808,7813,7818,7823,7828,7833,7838,7843,7848,7853,7858,7863,7868,7873,7878,7883,7888,7893,7898,7903,7908,7913,7918,7923,7928,7933,7938,7943,7948,7953,7958,7963,7968,7973,7978,7983,7988,7993,7998,8003,8008,8013,8018,8023,8028,8033,8038,8043,8048,8053,8058,8063,8068,8073,8078,8083,8088,8093,8098,8103,8108,8113,8118,8123,8128,8133,8138,8143,8148,8153,8158,8163,8168,8173,8178,8183,8188,8193,8198,8203,8208,8213,8218,8223,8228,8233,8238,8243,8248,8253,8258,8263,8268,8273,8278,8283,8288,8293,8298,8303,8308,8313,8318,8323,8328,8333,8338,8343,8348,8353,8358,8363,8368,8373,8378,8383,8388,8393,8398,8403,8408,8413,8418,8423,8428,8433,8438,8443,8448,8453,8458,8463,8468,8473,8478,8483,8488,8493,8498,8503,8508,8513,8518,8523,8528,8533,8538,8543,8548,8553,8558,8563,8568,8573,8578,8583,8588,8593,8598,8603,8608,8613,8618,8623,8628,8633,8638,8643,8648,8653,8658,8663,8668,8673,8678,8683,8688,8693,8698,8703,8708,8713,8718,8723,8728,8733,8738,8743,8748,8753,8758,8763,8768,8773,8778,8783,8788,8793,8798,8803,8808,8813,8818,8823,8828,8833,8838,8843,8848,8853,8858,8863,8868,8873,8878],{},[46,5085,5086],{},[109,5087,5088],{},"Skateboard Risers",[46,5090,5091],{},[109,5092,5093],{},"Baby Play Yards",[46,5095,5096],{},[109,5097,5098],{},"Power Hedge Trimmers",[46,5100,5101],{},[109,5102,5103],{},"Eyeglass Cases",[46,5105,5106],{},[109,5107,5108],{},"Microphone Splitters",[46,5110,5111],{},[109,5112,5113],{},"Electric Buffet Servers",[46,5115,5116],{},[109,5117,5118],{},"Radio Control Vehicle Servos",[46,5120,5121],{},[109,5122,5123],{},"Sticky Notes",[46,5125,5126],{},[109,5127,5128],{},"Matcha Tea Bowls & Whisks",[46,5130,5131],{},[109,5132,5133],{},"Doughs",[46,5135,5136],{},[109,5137,5138],{},"Taffy Candy",[46,5140,5141],{},[109,5142,5143],{},"Hair Dryers",[46,5145,5146],{},[109,5147,5148],{},"Base Layers",[46,5150,5151],{},[109,5152,5153],{},"Emergency Lighting",[46,5155,5156],{},[109,5157,5158],{},"Bidet Toilet Seats",[46,5160,5161],{},[109,5162,5163],{},"Purse Making Supplies",[46,5165,5166],{},[109,5167,5168],{},"Grill Grid Lifters",[46,5170,5171],{},[109,5172,5173],{},"Hunting Scents",[46,5175,5176],{},[109,5177,5178],{},"Automotive Headlight Restorer",[46,5180,5181],{},[109,5182,5183],{},"Ear Thermometer Replacement Lens Filters",[46,5185,5186],{},[109,5187,5188],{},"Glassware & Drinkware",[46,5190,5191],{},[109,5192,5193],{},"Precious Metals",[46,5195,5196],{},[109,5197,5198],{},"Lab Chromatography Paper",[46,5200,5201],{},[109,5202,5203],{},"Plant Terrariums",[46,5205,5206],{},[109,5207,5208],{},"Microphone Cables",[46,5210,5211],{},[109,5212,5213],{},"Glucose Supplements",[46,5215,5216],{},[109,5217,5218],{},"Snow Skis",[46,5220,5221],{},[109,5222,5223],{},"Perineal Cleansers",[46,5225,5226],{},[109,5227,5228],{},"Soda Maker Kits",[46,5230,5231],{},[109,5232,5233],{},"Camera Accessory Bundles",[46,5235,5236],{},[109,5237,5238],{},"Tetherball Equipment",[46,5240,5241],{},[109,5242,5243],{},"Paint Reducers & Retarders",[46,5245,5246],{},[109,5247,5248],{},"Pork Rinds",[46,5250,5251],{},[109,5252,5253],{},"Portable Basketball Systems",[46,5255,5256],{},[109,5257,5258],{},"Plate Joiners",[46,5260,5261],{},[109,5262,5263],{},"Other Weight Loss Supplies",[46,5265,5266],{},[109,5267,5268],{},"Powder Candy",[46,5270,5271],{},[109,5272,5273],{},"Outdoor Kitchen Serving & Storage Carts",[46,5275,5276],{},[109,5277,5278],{},"Unitards & Leotards",[46,5280,5281],{},[109,5282,5283],{},"Lab Sample Bags",[46,5285,5286],{},[109,5287,5288],{},"Fishing Rod & Reel Combos",[46,5290,5291],{},[109,5292,5293],{},"Adhesive Tapes",[46,5295,5296],{},[109,5297,5298],{},"Track & Field Markers",[46,5300,5301],{},[109,5302,5303],{},"Fruit & Vegetable Corers",[46,5305,5306],{},[109,5307,5308],{},"Automotive Fuel Tank Caps",[46,5310,5311],{},[109,5312,5313],{},"Drawing Boards",[46,5315,5316],{},[109,5317,5318],{},"Hand Dryers",[46,5320,5321],{},[109,5322,5323],{},"Pregnancy Tests",[46,5325,5326],{},[109,5327,5328],{},"Cat Litter Mats",[46,5330,5331],{},[109,5332,5333],{},"Facial Wipes",[46,5335,5336],{},[109,5337,5338],{},"Exercise Weights",[46,5340,5341],{},[109,5342,5343],{},"Sewing Pins",[46,5345,5346],{},[109,5347,5348],{},"Other Makeup Brushes & Tools",[46,5350,5351],{},[109,5352,5353],{},"Other Shaving Supplies",[46,5355,5356],{},[109,5357,5358],{},"Sugar Packet Holders",[46,5360,5361],{},[109,5362,5363],{},"Honey Dippers",[46,5365,5366],{},[109,5367,5368],{},"Artificial Topiaries",[46,5370,5371],{},[109,5372,5373],{},"Cupcake Making Kits",[46,5375,5376],{},[109,5377,5378],{},"Mobility Walker Bags, Baskets & Carriers",[46,5380,5381],{},[109,5382,5383],{},"Faucet Water Filters",[46,5385,5386],{},[109,5387,5388],{},"Urinary Tract Infection Test Strips",[46,5390,5391],{},[109,5392,5393],{},"Baptism Gowns & Outfits",[46,5395,5396],{},[109,5397,5398],{},"Function Generators",[46,5400,5401],{},[109,5402,5403],{},"FM Transmitters",[46,5405,5406],{},[109,5407,5408],{},"Home Brewing Refractometers",[46,5410,5411],{},[109,5412,5413],{},"Saddle Bags",[46,5415,5416],{},[109,5417,5418],{},"Track & Field Competitor Numbers",[46,5420,5421],{},[109,5422,5423],{},"Fuel Distributors",[46,5425,5426],{},[109,5427,5428],{},"Nicotine Patches",[46,5430,5431],{},[109,5432,5433],{},"Griddles & Grill Pans",[46,5435,5436],{},[109,5437,5438],{},"Planter & Stand Sets",[46,5440,5441],{},[109,5442,5443],{},"Other Pet Health Supplies",[46,5445,5446],{},[109,5447,5448],{},"Scooter Decks",[46,5450,5451],{},[109,5452,5453],{},"Knitting & Crochet Stitch Counters",[46,5455,5456],{},[109,5457,5458],{},"Camera Tool Kits",[46,5460,5461],{},[109,5462,5463],{},"Eyelash Combs",[46,5465,5466],{},[109,5467,5468],{},"Blouses & Tops",[46,5470,5471],{},[109,5472,5473],{},"Knitting & Crochet Stitch Markers",[46,5475,5476],{},[109,5477,5478],{},"Hand Tool Punches",[46,5480,5481],{},[109,5482,5483],{},"Climbing Rappel Devices",[46,5485,5486],{},[109,5487,5488],{},"Kitchen Towels",[46,5490,5491],{},[109,5492,5493],{},"Homogenizer Accessories",[46,5495,5496],{},[109,5497,5498],{},"Attendance Time Cards",[46,5500,5501],{},[109,5502,5503],{},"Digital Camera Parts",[46,5505,5506],{},[109,5507,5508],{},"Planners & Appointment Book Refills",[46,5510,5511],{},[109,5512,5513],{},"Herbal Supplements",[46,5515,5516],{},[109,5517,5518],{},"Hand-Sewing Needles",[46,5520,5521],{},[109,5522,5523],{},"Weight Bars",[46,5525,5526],{},[109,5527,5528],{},"Photography Fixers",[46,5530,5531],{},[109,5532,5533],{},"Massage Table Carrying Cases",[46,5535,5536],{},[109,5537,5538],{},"Grill Covers",[46,5540,5541],{},[109,5542,5543],{},"Other Skating Supplies",[46,5545,5546],{},[109,5547,5548],{},"Maple Syrups",[46,5550,5551],{},[109,5552,5553],{},"Pizza Stones & Pans",[46,5555,5556],{},[109,5557,5558],{},"Manual Letter Openers",[46,5560,5561],{},[109,5562,5563],{},"Water Guns",[46,5565,5566],{},[109,5567,5568],{},"Manual Can Openers",[46,5570,5571],{},[109,5572,5573],{},"Electronic Touchpads",[46,5575,5576],{},[109,5577,5578],{},"String Trimmer Replacement Parts",[46,5580,5581],{},[109,5582,5583],{},"Baby Bodysuits & One-Pieces",[46,5585,5586],{},[109,5587,5588],{},"Walking Cane & Crutch Tips",[46,5590,5591],{},[109,5592,5593],{},"Cutting Mats",[46,5595,5596],{},[109,5597,5598],{},"Throwing Knives",[46,5600,5601],{},[109,5602,5603],{},"Skins for Tablets",[46,5605,5606],{},[109,5607,5608],{},"Serving Utensils & Sets",[46,5610,5611],{},[109,5612,5613],{},"Photographic Art",[46,5615,5616],{},[109,5617,5618],{},"Soap Making Kits",[46,5620,5621],{},[109,5622,5623],{},"Athletic Shirts & Tops",[46,5625,5626],{},[109,5627,5628],{},"Ticket Rolls",[46,5630,5631],{},[109,5632,5633],{},"Fireplace Bellows",[46,5635,5636],{},[109,5637,5638],{},"Travel Plug Adapters",[46,5640,5641],{},[109,5642,5643],{},"Vacuum Sealers",[46,5645,5646],{},[109,5647,5648],{},"Small Animal Habitat Decor",[46,5650,5651],{},[109,5652,5653],{},"Vacuum Tubes",[46,5655,5656],{},[109,5657,5658],{},"Stroller Connectors",[46,5660,5661],{},[109,5662,5663],{},"Ceiling Fans",[46,5665,5666],{},[109,5667,5668],{},"Other Dancing Supplies",[46,5670,5671],{},[109,5672,5673],{},"Model Train Locomotives",[46,5675,5676],{},[109,5677,5678],{},"Electronic Cigarette Starter Kits",[46,5680,5681],{},[109,5682,5683],{},"Bicycle Baskets",[46,5685,5686],{},[109,5687,5688],{},"Golf Visors",[46,5690,5691],{},[109,5692,5693],{},"Bicycle Storage Hooks",[46,5695,5696],{},[109,5697,5698],{},"Handheld Video Games",[46,5700,5701],{},[109,5702,5703],{},"Cocktail Mixers",[46,5705,5706],{},[109,5707,5708],{},"Follow-Focus Levers",[46,5710,5711],{},[109,5712,5713],{},"Embossing Tools",[46,5715,5716],{},[109,5717,5718],{},"Incentive Charts",[46,5720,5721],{},[109,5722,5723],{},"Pressure Gauges",[46,5725,5726],{},[109,5727,5728],{},"Art Paints & Pigment Powders",[46,5730,5731],{},[109,5732,5733],{},"Replacement Water Filters",[46,5735,5736],{},[109,5737,5738],{},"Moisture Meters",[46,5740,5741],{},[109,5742,5743],{},"Other Pet Grooming Supplies",[46,5745,5746],{},[109,5747,5748],{},"Shopping Cart & High Chair Covers",[46,5750,5751],{},[109,5752,5753],{},"Nursing Pillows",[46,5755,5756],{},[109,5757,5758],{},"Disposable Cutlery Sets",[46,5760,5761],{},[109,5762,5763],{},"Heat Guns",[46,5765,5766],{},[109,5767,5768],{},"Construction Flashing",[46,5770,5771],{},[109,5772,5773],{},"Automotive Aerodynamics Kits",[46,5775,5776],{},[109,5777,5778],{},"Fire Retardants",[46,5780,5781],{},[109,5782,5783],{},"Gun Snakes",[46,5785,5786],{},[109,5787,5788],{},"Snow Removal Rakes & Hand Pushers",[46,5790,5791],{},[109,5792,5793],{},"Costume Wigs",[46,5795,5796],{},[109,5797,5798],{},"Outdoor Decorative Stones",[46,5800,5801],{},[109,5802,5803],{},"Lip Stains",[46,5805,5806],{},[109,5807,5808],{},"Workwear Uniform Badges",[46,5810,5811],{},[109,5812,5813],{},"Gut Health Tests",[46,5815,5816],{},[109,5817,5818],{},"Carbon Monoxide Alarms",[46,5820,5821],{},[109,5822,5823],{},"Cable Covers",[46,5825,5826],{},[109,5827,5828],{},"Lathe Cylindrical Rollers",[46,5830,5831],{},[109,5832,5833],{},"Hamburger Patty Makers",[46,5835,5836],{},[109,5837,5838],{},"Printing Press Accessories",[46,5840,5841],{},[109,5842,5843],{},"Automotive Light Covers & Guards",[46,5845,5846],{},[109,5847,5848],{},"Overbed Tables",[46,5850,5851],{},[109,5852,5853],{},"Artwork Cases & Portfolios",[46,5855,5856],{},[109,5857,5858],{},"Disposable Storage Bags",[46,5860,5861],{},[109,5862,5863],{},"Football Helmets",[46,5865,5866],{},[109,5867,5868],{},"Automatic Transmission Filters",[46,5870,5871],{},[109,5872,5873],{},"Live Trees",[46,5875,5876],{},[109,5877,5878],{},"Umpire Leg Guards",[46,5880,5881],{},[109,5882,5883],{},"Line Conditioners",[46,5885,5886],{},[109,5887,5888],{},"Cup & Saucer Sets",[46,5890,5891],{},[109,5892,5893],{},"Rain Barrels",[46,5895,5896],{},[109,5897,5898],{},"S",[46,5900,5901],{},[109,5902,4877],{},[46,5904,5905],{},[109,5906,5907],{},"s Tapes",[46,5909,5910],{},[109,5911,5912],{},"Indoor Fireplaces",[46,5914,5915],{},[109,5916,5917],{},"Headphone Cases",[46,5919,5920],{},[109,5921,5922],{},"Battery Testers",[46,5924,5925],{},[109,5926,5927],{},"Floor Hockey Carts",[46,5929,5930],{},[109,5931,5932],{},"T-Shirts",[46,5934,5935],{},[109,5936,5937],{},"Dunun Drums",[46,5939,5940],{},[109,5941,5942],{},"Speed Reducers",[46,5944,5945],{},[109,5946,5947],{},"Percussion Mallets",[46,5949,5950],{},[109,5951,5952],{},"Pallet Covers",[46,5954,5955],{},[109,5956,5957],{},"Telescope Cases",[46,5959,5960],{},[109,5961,5962],{},"Automotive Grilles",[46,5964,5965],{},[109,5966,5967],{},"Fencing Sport Epee Parts",[46,5969,5970],{},[109,5971,5972],{},"Emergency Food Kits",[46,5974,5975],{},[109,5976,5977],{},"Sports Corner Flags",[46,5979,5980],{},[109,5981,5982],{},"Bird Nests & Nesting Material",[46,5984,5985],{},[109,5986,5987],{},"Boxing Rings",[46,5989,5990],{},[109,5991,5992],{},"Paper Sorters",[46,5994,5995],{},[109,5996,5997],{},"Lollipop & Treat Sticks",[46,5999,6000],{},[109,6001,6002],{},"Cabin Air Filters",[46,6004,6005],{},[109,6006,6007],{},"Pool Covers",[46,6009,6010],{},[109,6011,6012],{},"Video Game Dance Pads",[46,6014,6015],{},[109,6016,6017],{},"Football Sleds & Chutes",[46,6019,6020],{},[109,6021,6022],{},"Clay & Dough Extruders & Presses",[46,6024,6025],{},[109,6026,6027],{},"Baseball Gloves & Mitts",[46,6029,6030],{},[109,6031,6032],{},"Yeasts & Leaveners",[46,6034,6035],{},[109,6036,6037],{},"Skins for Aerial Drones",[46,6039,6040],{},[109,6041,6042],{},"Replacement Faucet Water Filters",[46,6044,6045],{},[109,6046,6047],{},"Other Electronic Components & Accessories",[46,6049,6050],{},[109,6051,6052],{},"Lab Coats",[46,6054,6055],{},[109,6056,6057],{},"Laser Detectors",[46,6059,6060],{},[109,6061,6062],{},"Baseball Sliding Shorts",[46,6064,6065],{},[109,6066,6067],{},"Hunting Game Finders",[46,6069,6070],{},[109,6071,6072],{},"Rain & Snow Gauges",[46,6074,6075],{},[109,6076,6077],{},"Shapewear Bodysuits",[46,6079,6080],{},[109,6081,6082],{},"Toiletry Kits & Bags",[46,6084,6085],{},[109,6086,6087],{},"Photo Enlarger Heads",[46,6089,6090],{},[109,6091,6092],{},"Athletic Outfit Sets",[46,6094,6095],{},[109,6096,6097],{},"Combustion Analyzers",[46,6099,6100],{},[109,6101,6102],{},"Personal Organizer Refills & Accessories",[46,6104,6105],{},[109,6106,6107],{},"Harmonic Exciters",[46,6109,6110],{},[109,6111,6112],{},"Billiard Table Felt",[46,6114,6115],{},[109,6116,6117],{},"Video Game Console Parts",[46,6119,6120],{},[109,6121,6122],{},"Ham Radio Transceivers",[46,6124,6125],{},[109,6126,6127],{},"Baby Juices",[46,6129,6130],{},[109,6131,6132],{},"Hot Dog Machines",[46,6134,6135],{},[109,6136,6137],{},"Pipe Inspection Cameras",[46,6139,6140],{},[109,6141,6142],{},"Misting Systems",[46,6144,6145],{},[109,6146,6147],{},"Sleeping Bag Liners",[46,6149,6150],{},[109,6151,6152],{},"Kids Gardening Tools",[46,6154,6155],{},[109,6156,6157],{},"Camera Film Winders",[46,6159,6160],{},[109,6161,6162],{},"Other Billiard Supplies",[46,6164,6165],{},[109,6166,6167],{},"Ergonomic Backrests",[46,6169,6170],{},[109,6171,6172],{},"Balloon Pumps",[46,6174,6175],{},[109,6176,6177],{},"Lump Charcoals",[46,6179,6180],{},[109,6181,6182],{},"Pilates Barrels",[46,6184,6185],{},[109,6186,6187],{},"Surfing Leashes",[46,6189,6190],{},[109,6191,6192],{},"Dart Shafts",[46,6194,6195],{},[109,6196,6197],{},"Makeup Blotting Paper",[46,6199,6200],{},[109,6201,6202],{},"Eye Masks",[46,6204,6205],{},[109,6206,6207],{},"Welding Helmets",[46,6209,6210],{},[109,6211,6212],{},"Electronic Coils",[46,6214,6215],{},[109,6216,6217],{},"Energy Drinks",[46,6219,6220],{},[109,6221,6222],{},"Push-Up Stands",[46,6224,6225],{},[109,6226,6227],{},"Photography Stop Baths",[46,6229,6230],{},[109,6231,6232],{},"Handbag Hook Hangers",[46,6234,6235],{},[109,6236,6237],{},"Network Security Devices",[46,6239,6240],{},[109,6241,6242],{},"Stitch Holders",[46,6244,6245],{},[109,6246,6247],{},"Bicycle Pegs",[46,6249,6250],{},[109,6251,6252],{},"Outdoor Daybeds",[46,6254,6255],{},[109,6256,6257],{},"Party Favors",[46,6259,6260],{},[109,6261,6262],{},"Canning Kits",[46,6264,6265],{},[109,6266,6267],{},"Molding & Casting Materials & Kits",[46,6269,6270],{},[109,6271,6272],{},"Musical Instrument Bodies",[46,6274,6275],{},[109,6276,6277],{},"Other Games",[46,6279,6280],{},[109,6281,6282],{},"Electrolyte Solutions",[46,6284,6285],{},[109,6286,6287],{},"Fruit & Wine Crushers & Destemmers",[46,6289,6290],{},[109,6291,6292],{},"Power Inverters",[46,6294,6295],{},[109,6296,6297],{},"Jewelry Jump Rings & Split Rings",[46,6299,6300],{},[109,6301,6302],{},"Table Tennis Paddles",[46,6304,6305],{},[109,6306,6307],{},"SIM Card Backup Devices",[46,6309,6310],{},[109,6311,6312],{},"Tie Pins",[46,6314,6315],{},[109,6316,6317],{},"Billiard Tables",[46,6319,6320],{},[109,6321,6322],{},"Archery Broadheads",[46,6324,6325],{},[109,6326,6327],{},"Vehicle Windshields",[46,6329,6330],{},[109,6331,6332],{},"Jock Straps",[46,6334,6335],{},[109,6336,6337],{},"Pet Live Animals",[46,6339,6340],{},[109,6341,6342],{},"DC-to-DC Converters",[46,6344,6345],{},[109,6346,6347],{},"Transport Drums",[46,6349,6350],{},[109,6351,6352],{},"Vinyl Figures",[46,6354,6355],{},[109,6356,6357],{},"Entertainment Centers",[46,6359,6360],{},[109,6361,6362],{},"Fireplace Tools",[46,6364,6365],{},[109,6366,6367],{},"Serving Forks",[46,6369,6370],{},[109,6371,6372],{},"Nut Splitters",[46,6374,6375],{},[109,6376,6377],{},"Blasters & Foam Play",[46,6379,6380],{},[109,6381,6382],{},"Garden Border Edging",[46,6384,6385],{},[109,6386,6387],{},"Gun Holsters & Holders",[46,6389,6390],{},[109,6391,6392],{},"Spice Racks & Organizers",[46,6394,6395],{},[109,6396,6397],{},"Stamps & Stamp Sets",[46,6399,6400],{},[109,6401,6402],{},"Udu Drums",[46,6404,6405],{},[109,6406,6407],{},"Reception Chairs & Seating",[46,6409,6410],{},[109,6411,6412],{},"Pepper & Peppercorns",[46,6414,6415],{},[109,6416,6417],{},"Golf Drivers",[46,6419,6420],{},[109,6421,6422],{},"CC Cream",[46,6424,6425],{},[109,6426,6427],{},"Yoga Socks",[46,6429,6430],{},[109,6431,6432],{},"Vacuum Cleaner Attachments",[46,6434,6435],{},[109,6436,6437],{},"Planter Liners",[46,6439,6440],{},[109,6441,6442],{},"Pie & Pastry Fillings",[46,6444,6445],{},[109,6446,6447],{},"Bed Skirts",[46,6449,6450],{},[109,6451,6452],{},"Dart Carrying Cases & Wallets",[46,6454,6455],{},[109,6456,6457],{},"Pizza Ovens",[46,6459,6460],{},[109,6461,6462],{},"Crepe Spreaders",[46,6464,6465],{},[109,6466,6467],{},"Hex Tools",[46,6469,6470],{},[109,6471,6472],{},"Stretch Film & Shrink Wrap",[46,6474,6475],{},[109,6476,6477],{},"Massage Headrests",[46,6479,6480],{},[109,6481,6482],{},"Electronics Carrying Cases",[46,6484,6485],{},[109,6486,6487],{},"Dust Collectors",[46,6489,6490],{},[109,6491,6492],{},"Decorative Stones",[46,6494,6495],{},[109,6496,6497],{},"Yoga Straps",[46,6499,6500],{},[109,6501,6502],{},"Espresso Machines",[46,6504,6505],{},[109,6506,6507],{},"Lab Face Masks & Shields",[46,6509,6510],{},[109,6511,6512],{},"Guitar Effects Pedals",[46,6514,6515],{},[109,6516,6517],{},"Hockey Hip Pads",[46,6519,6520],{},[109,6521,6522],{},"Pressure Cookers & Canners",[46,6524,6525],{},[109,6526,6527],{},"Diabetic Foot Care",[46,6529,6530],{},[109,6531,6532],{},"Nail Top Coat",[46,6534,6535],{},[109,6536,6537],{},"Wax Molding Materials",[46,6539,6540],{},[109,6541,6542],{},"Dock Guards",[46,6544,6545],{},[109,6546,6547],{},"Decoupage Tools & Sets",[46,6549,6550],{},[109,6551,6552],{},"Rugby Balls",[46,6554,6555],{},[109,6556,6557],{},"Bra Back Adapters",[46,6559,6560],{},[109,6561,6562],{},"Other Backyard Wildlife Supplies",[46,6564,6565],{},[109,6566,6567],{},"Food Peelers",[46,6569,6570],{},[109,6571,6572],{},"Modular Synthesizers",[46,6574,6575],{},[109,6576,6577],{},"Mirror Balls",[46,6579,6580],{},[109,6581,6582],{},"Cricket Wickets",[46,6584,6585],{},[109,6586,6587],{},"Snatch Rigging Blocks",[46,6589,6590],{},[109,6591,6592],{},"Rowing Shells",[46,6594,6595],{},[109,6596,6597],{},"Staple Gun Staples",[46,6599,6600],{},[109,6601,6602],{},"Golf Rangefinders",[46,6604,6605],{},[109,6606,6607],{},"Waterbed Liners",[46,6609,6610],{},[109,6611,6612],{},"Beer Glasses",[46,6614,6615],{},[109,6616,6617],{},"KVM Switches",[46,6619,6620],{},[109,6621,6622],{},"Panel Carriers",[46,6624,6625],{},[109,6626,6627],{},"Sanding Frames",[46,6629,6630],{},[109,6631,6632],{},"First Aid Tape",[46,6634,6635],{},[109,6636,6637],{},"Hand Pruners & Loppers",[46,6639,6640],{},[109,6641,6642],{},"Reusable Training Pants",[46,6644,6645],{},[109,6646,6647],{},"Outdoor Spas",[46,6649,6650],{},[109,6651,6652],{},"Air Hockey Pucks",[46,6654,6655],{},[109,6656,6657],{},"Cat Trees",[46,6659,6660],{},[109,6661,6662],{},"Surgical Gowns",[46,6664,6665],{},[109,6666,6667],{},"Baseball Protective Screens",[46,6669,6670],{},[109,6671,6672],{},"Artificial Plants",[46,6674,6675],{},[109,6676,6677],{},"Basting Brushes",[46,6679,6680],{},[109,6681,6682],{},"Archery Arrows",[46,6684,6685],{},[109,6686,6687],{},"Calibration Weights",[46,6689,6690],{},[109,6691,6692],{},"Laptop Computers",[46,6694,6695],{},[109,6696,6697],{},"Chalkboard Chalk",[46,6699,6700],{},[109,6701,6702],{},"Nasal Aspirators",[46,6704,6705],{},[109,6706,6707],{},"Instant Coffee",[46,6709,6710],{},[109,6711,6712],{},"Vanity Tables & Table & Bench Sets",[46,6714,6715],{},[109,6716,6717],{},"Printer Drums",[46,6719,6720],{},[109,6721,6722],{},"Automotive Body Paint",[46,6724,6725],{},[109,6726,6727],{},"Paraffin Treatment Hand & Foot Mitts",[46,6729,6730],{},[109,6731,6732],{},"Stovetop Espresso Pots",[46,6734,6735],{},[109,6736,6737],{},"Robotic Lawn Mowers",[46,6739,6740],{},[109,6741,6742],{},"Phone Grips",[46,6744,6745],{},[109,6746,6747],{},"Hammock Chairs",[46,6749,6750],{},[109,6751,6752],{},"Home Brewing Kegs & Keg Supplies",[46,6754,6755],{},[109,6756,6757],{},"Dishwasher Rack Adjusters",[46,6759,6760],{},[109,6761,6762],{},"Sculpting Tools & Kits",[46,6764,6765],{},[109,6766,6767],{},"Mattocks & Pickaxes",[46,6769,6770],{},[109,6771,6772],{},"Watch & Clock Hands",[46,6774,6775],{},[109,6776,6777],{},"Umpire Bags",[46,6779,6780],{},[109,6781,6782],{},"Other Lighting Accessories",[46,6784,6785],{},[109,6786,6787],{},"Lab Shaker Accessories",[46,6789,6790],{},[109,6791,6792],{},"Print Servers",[46,6794,6795],{},[109,6796,6797],{},"Home Brewing Beer Bottle Trees",[46,6799,6800],{},[109,6801,6802],{},"Football Hand Warmers",[46,6804,6805],{},[109,6806,6807],{},"Spectrum Analyzers",[46,6809,6810],{},[109,6811,6812],{},"Hair Perms & Texturizers",[46,6814,6815],{},[109,6816,6817],{},"Lab Glassware Washers",[46,6819,6820],{},[109,6821,6822],{},"Trailer Weight Distributing Systems",[46,6824,6825],{},[109,6826,6827],{},"Digital Cameras",[46,6829,6830],{},[109,6831,6832],{},"Drum & Pail Mixers",[46,6834,6835],{},[109,6836,6837],{},"Porch Swings",[46,6839,6840],{},[109,6841,6842],{},"Gun Choke Tubes",[46,6844,6845],{},[109,6846,6847],{},"Pet Milk Replacers",[46,6849,6850],{},[109,6851,6852],{},"Fabric Paints",[46,6854,6855],{},[109,6856,6857],{},"Other Kiteboarding Accessories",[46,6859,6860],{},[109,6861,6862],{},"Paper Cups",[46,6864,6865],{},[109,6866,6867],{},"Bottle Pourers",[46,6869,6870],{},[109,6871,6872],{},"Golf Divot Tools",[46,6874,6875],{},[109,6876,6877],{},"Aquarium Cleaning Tools",[46,6879,6880],{},[109,6881,6882],{},"Fishing Vest & Packs",[46,6884,6885],{},[109,6886,6887],{},"Die-Cut Cartridges",[46,6889,6890],{},[109,6891,6892],{},"Kiteboard Control Bars",[46,6894,6895],{},[109,6896,6897],{},"Welding Tips",[46,6899,6900],{},[109,6901,6902],{},"Food Tongs",[46,6904,6905],{},[109,6906,6907],{},"Corn & Callus Remover Cushions",[46,6909,6910],{},[109,6911,6912],{},"Cocktail Shakers",[46,6914,6915],{},[109,6916,6917],{},"Inspection Mirrors",[46,6919,6920],{},[109,6921,6922],{},"Fruit Snacks",[46,6924,6925],{},[109,6926,6927],{},"Kayak Storage Racks",[46,6929,6930],{},[109,6931,6932],{},"Cycling Vests",[46,6934,6935],{},[109,6936,6937],{},"Field Hockey Goggles",[46,6939,6940],{},[109,6941,6942],{},"Breathalyzer Alcohol Monitors",[46,6944,6945],{},[109,6946,6947],{},"Dry Erase Markers",[46,6949,6950],{},[109,6951,6952],{},"Racquet Sport Stringing Machines",[46,6954,6955],{},[109,6956,6957],{},"Gun Swivels",[46,6959,6960],{},[109,6961,6962],{},"Power Tool Chargers",[46,6964,6965],{},[109,6966,6967],{},"Home Brewing Sanitization Kits",[46,6969,6970],{},[109,6971,6972],{},"Ice Cream, Sorbet & Frozen Yogurt",[46,6974,6975],{},[109,6976,6977],{},"Underwater Cameras",[46,6979,6980],{},[109,6981,6982],{},"Hair Color Stain Shields",[46,6984,6985],{},[109,6986,6987],{},"Roof Gutter Accessories",[46,6989,6990],{},[109,6991,6992],{},"Bicycle Brake Rotors",[46,6994,6995],{},[109,6996,6997],{},"Repinique Drums",[46,6999,7000],{},[109,7001,7002],{},"Camera Film Backs & Holders",[46,7004,7005],{},[109,7006,7007],{},"Automotive Cigarette Lighters & Plugs",[46,7009,7010],{},[109,7011,7012],{},"Meal Kits",[46,7014,7015],{},[109,7016,7017],{},"Lathe Cole Jaws",[46,7019,7020],{},[109,7021,7022],{},"PBX Phone Systems",[46,7024,7025],{},[109,7026,7027],{},"Face Serums",[46,7029,7030],{},[109,7031,7032],{},"Exercise Treadmills",[46,7034,7035],{},[109,7036,7037],{},"Lawn Sweepers",[46,7039,7040],{},[109,7041,7042],{},"Sunglasses Replacement Lenses",[46,7044,7045],{},[109,7046,7047],{},"Pipe Fitting Reducers",[46,7049,7050],{},[109,7051,7052],{},"Microphone Pop Filters",[46,7054,7055],{},[109,7056,7057],{},"MiniDisc Players",[46,7059,7060],{},[109,7061,7062],{},"Audio/Video Cables",[46,7064,7065],{},[109,7066,7067],{},"Hand Sanitizers",[46,7069,7070],{},[109,7071,7072],{},"Nail Pullers",[46,7074,7075],{},[109,7076,7077],{},"Traditional Salwar Kameez",[46,7079,7080],{},[109,7081,7082],{},"Other Air Tool Accessories",[46,7084,7085],{},[109,7086,7087],{},"Cymbal Pads",[46,7089,7090],{},[109,7091,7092],{},"Automotive Winch Mounting Systems",[46,7094,7095],{},[109,7096,7097],{},"Laptop Bags",[46,7099,7100],{},[109,7101,7102],{},"Contour Makeup Set",[46,7104,7105],{},[109,7106,7107],{},"Puzzle Cubes",[46,7109,7110],{},[109,7111,7112],{},"Plant Covers",[46,7114,7115],{},[109,7116,7117],{},"Empty Paint Cans",[46,7119,7120],{},[109,7121,7122],{},"Tableware Knives",[46,7124,7125],{},[109,7126,7127],{},"Storage Sheds",[46,7129,7130],{},[109,7131,7132],{},"Window & Door Frames",[46,7134,7135],{},[109,7136,7137],{},"Paper Plates",[46,7139,7140],{},[109,7141,7142],{},"Calculator Accessories",[46,7144,7145],{},[109,7146,7147],{},"Shaving Sets",[46,7149,7150],{},[109,7151,7152],{},"Microphone Preamplifiers",[46,7154,7155],{},[109,7156,7157],{},"Baby Feeding Chairs",[46,7159,7160],{},[109,7161,7162],{},"Rain Ponchos",[46,7164,7165],{},[109,7166,7167],{},"Aquarium Thermometers",[46,7169,7170],{},[109,7171,7172],{},"Mini Helmets",[46,7174,7175],{},[109,7176,7177],{},"RV Awnings",[46,7179,7180],{},[109,7181,7182],{},"Lawn & Garden Sprayers",[46,7184,7185],{},[109,7186,7187],{},"Car CD Changers",[46,7189,7190],{},[109,7191,7192],{},"Selfie Sticks",[46,7194,7195],{},[109,7196,7197],{},"Calibration Standard Rods",[46,7199,7200],{},[109,7201,7202],{},"Lab Chromatography TLC Developing Tanks",[46,7204,7205],{},[109,7206,7207],{},"Poultry Treats",[46,7209,7210],{},[109,7211,7212],{},"Mechanical Pencil Refills",[46,7214,7215],{},[109,7216,7217],{},"Dip Stands",[46,7219,7220],{},[109,7221,7222],{},"Drinkware Accessories",[46,7224,7225],{},[109,7226,7227],{},"Artist Manikins",[46,7229,7230],{},[109,7231,7232],{},"Leathercraft Kits",[46,7234,7235],{},[109,7236,7237],{},"Metalworking Spring Plungers",[46,7239,7240],{},[109,7241,7242],{},"Marquee Signs",[46,7244,7245],{},[109,7246,7247],{},"Craft Dyes",[46,7249,7250],{},[109,7251,7252],{},"Wakesurf Boards",[46,7254,7255],{},[109,7256,7257],{},"Pool Safety Supplies",[46,7259,7260],{},[109,7261,7262],{},"Pedal Boats",[46,7264,7265],{},[109,7266,7267],{},"Snack Crackers",[46,7269,7270],{},[109,7271,7272],{},"Jewelry Cleaning Machines",[46,7274,7275],{},[109,7276,7277],{},"Party Supply Sets",[46,7279,7280],{},[109,7281,7282],{},"Other Decking & Fencing Hardware",[46,7284,7285],{},[109,7286,7287],{},"Motorcycle Glasses",[46,7289,7290],{},[109,7291,7292],{},"Art Smocks",[46,7294,7295],{},[109,7296,7297],{},"Archery Nocks",[46,7299,7300],{},[109,7301,7302],{},"Diving Regulators",[46,7304,7305],{},[109,7306,7307],{},"Camera Flash Snoots",[46,7309,7310],{},[109,7311,7312],{},"Martial Arts Weapon Stands",[46,7314,7315],{},[109,7316,7317],{},"Automotive Wiper Nozzles",[46,7319,7320],{},[109,7321,7322],{},"Tea Cozies",[46,7324,7325],{},[109,7326,7327],{},"Stadium Seats & Cushions",[46,7329,7330],{},[109,7331,7332],{},"Bear Protection",[46,7334,7335],{},[109,7336,7337],{},"Flagpole Brackets & Mounts",[46,7339,7340],{},[109,7341,7342],{},"Patio Umbrella Base Weights",[46,7344,7345],{},[109,7346,7347],{},"Stretch Film & Shrink Wrap Dispensers",[46,7349,7350],{},[109,7351,7352],{},"Punching Bag Hangers",[46,7354,7355],{},[109,7356,7357],{},"Track Lighting Sets",[46,7359,7360],{},[109,7361,7362],{},"Wheel Chocks & Stops",[46,7364,7365],{},[109,7366,7367],{},"Itching & Rash Treatments",[46,7369,7370],{},[109,7371,7372],{},"Automotive Rims",[46,7374,7375],{},[109,7376,7377],{},"Tire Pressure Gauges",[46,7379,7380],{},[109,7381,7382],{},"Hair Crimping Irons",[46,7384,7385],{},[109,7386,7387],{},"Baker",[46,7389,7390],{},[109,7391,7392],{},"s Helmets",[46,7394,7395],{},[109,7396,7397],{},"Curtains & Valances",[46,7399,7400],{},[109,7401,7402],{},"Aquarium Starter Kits",[46,7404,7405],{},[109,7406,7407],{},"Body Muds",[46,7409,7410],{},[109,7411,7412],{},"Body Piercing Retainers",[46,7414,7415],{},[109,7416,7417],{},"Hockey Chest Protectors",[46,7419,7420],{},[109,7421,7422],{},"Diving Boards",[46,7424,7425],{},[109,7426,7427],{},"Small Engines",[46,7429,7430],{},[109,7431,7432],{},"Pet Sofa & Chair Protectors",[46,7434,7435],{},[109,7436,7437],{},"Tent Accessories",[46,7439,7440],{},[109,7441,7442],{},"Pedal Covers",[46,7444,7445],{},[109,7446,7447],{},"Appliance Covers",[46,7449,7450],{},[109,7451,7452],{},"Vegetable Dips",[46,7454,7455],{},[109,7456,7457],{},"Hockey Shin Pads",[46,7459,7460],{},[109,7461,7462],{},"Acne Creams",[46,7464,7465],{},[109,7466,7467],{},"Mobility Aid Steps",[46,7469,7470],{},[109,7471,7472],{},"Quilting Frames",[46,7474,7475],{},[109,7476,7477],{},"Water Heaters",[46,7479,7480],{},[109,7481,7482],{},"Sound Pressure Level Meters",[46,7484,7485],{},[109,7486,7487],{},"Glider Rocking Chairs",[46,7489,7490],{},[109,7491,7492],{},"Punching Bags",[46,7494,7495],{},[109,7496,7497],{},"Nail Ridge Filler",[46,7499,7500],{},[109,7501,7502],{},"Yoga Gloves",[46,7504,7505],{},[109,7506,7507],{},"Jewelry Stringing Materials",[46,7509,7510],{},[109,7511,7512],{},"Dishwasher Rack Rollers",[46,7514,7515],{},[109,7516,7517],{},"Other Hair Removal Supplies",[46,7519,7520],{},[109,7521,7522],{},"Agility Ladders",[46,7524,7525],{},[109,7526,7527],{},"Watch Winders",[46,7529,7530],{},[109,7531,7532],{},"Blender Pitchers",[46,7534,7535],{},[109,7536,7537],{},"Hand Tampers",[46,7539,7540],{},[109,7541,7542],{},"Dehumidifier Accessories",[46,7544,7545],{},[109,7546,7547],{},"Punch Bowl Sets",[46,7549,7550],{},[109,7551,7552],{},"Mini Projectors",[46,7554,7555],{},[109,7556,7557],{},"Drinkware Sets",[46,7559,7560],{},[109,7561,7562],{},"Evaporated Milks",[46,7564,7565],{},[109,7566,7567],{},"Spoon Rests",[46,7569,7570],{},[109,7571,7572],{},"Juggling Toys",[46,7574,7575],{},[109,7576,7577],{},"Mixed Spices & Seasonings",[46,7579,7580],{},[109,7581,7582],{},"Bicycle Child Seats",[46,7584,7585],{},[109,7586,7587],{},"Water Coolant Systems",[46,7589,7590],{},[109,7591,7592],{},"Jai Alai Sets",[46,7594,7595],{},[109,7596,7597],{},"Surveillance Camera Lenses",[46,7599,7600],{},[109,7601,7602],{},"Chain Hoists",[46,7604,7605],{},[109,7606,7607],{},"Snack Pudding & Gelatin",[46,7609,7610],{},[109,7611,7612],{},"Hair Curling Wands",[46,7614,7615],{},[109,7616,7617],{},"Spa Cover Lifts",[46,7619,7620],{},[109,7621,7622],{},"Track Lighting Heads",[46,7624,7625],{},[109,7626,7627],{},"Photo Enlargers",[46,7629,7630],{},[109,7631,7632],{},"Photo Enlarger Lenses",[46,7634,7635],{},[109,7636,7637],{},"Plant Cages",[46,7639,7640],{},[109,7641,7642],{},"DJ Mixers",[46,7644,7645],{},[109,7646,7647],{},"Condiment Servers",[46,7649,7650],{},[109,7651,7652],{},"Electric Kettles",[46,7654,7655],{},[109,7656,7657],{},"Glass Raw Materials",[46,7659,7660],{},[109,7661,7662],{},"Radio Antennas",[46,7664,7665],{},[109,7666,7667],{},"Bicycle Front & Rear Racks",[46,7669,7670],{},[109,7671,7672],{},"Body Oils",[46,7674,7675],{},[109,7676,7677],{},"ATV Tires",[46,7679,7680],{},[109,7681,7682],{},"RAM Memory",[46,7684,7685],{},[109,7686,7687],{},"Pet Toothpaste",[46,7689,7690],{},[109,7691,7692],{},"Dressing Aid Sticks",[46,7694,7695],{},[109,7696,7697],{},"Coconut Knives",[46,7699,7700],{},[109,7701,7702],{},"Sports Pole Holders & Bases",[46,7704,7705],{},[109,7706,7707],{},"Dock Steps",[46,7709,7710],{},[109,7711,7712],{},"Bath Toy Storage",[46,7714,7715],{},[109,7716,7717],{},"Martial Arts Belts",[46,7719,7720],{},[109,7721,7722],{},"Currency Bands & Straps",[46,7724,7725],{},[109,7726,7727],{},"Outdoor Playsets",[46,7729,7730],{},[109,7731,7732],{},"Video Switchers",[46,7734,7735],{},[109,7736,7737],{},"Brake System Replacement Parts & Hardware",[46,7739,7740],{},[109,7741,7742],{},"Tennis Shorts",[46,7744,7745],{},[109,7746,7747],{},"Facial Treatments",[46,7749,7750],{},[109,7751,7752],{},"Athletic Compression Socks",[46,7754,7755],{},[109,7756,7757],{},"Brake Booster Filters",[46,7759,7760],{},[109,7761,7762],{},"Other Knitting & Crochet Supplies",[46,7764,7765],{},[109,7766,7767],{},"Martini Glasses",[46,7769,7770],{},[109,7771,7772],{},"Personal Organizers",[46,7774,7775],{},[109,7776,7777],{},"pH Meters",[46,7779,7780],{},[109,7781,7782],{},"Parchment Paper",[46,7784,7785],{},[109,7786,7787],{},"Other Gift Wrapping Supplies",[46,7789,7790],{},[109,7791,7792],{},"Leathercraft Accessories",[46,7794,7795],{},[109,7796,7797],{},"Rod Hockey",[46,7799,7800],{},[109,7801,7802],{},"House Numbers & Letters",[46,7804,7805],{},[109,7806,7807],{},"Toaster Pastries",[46,7809,7810],{},[109,7811,7812],{},"Anti-Chafing Creams",[46,7814,7815],{},[109,7816,7817],{},"Sunshine Recorders",[46,7819,7820],{},[109,7821,7822],{},"Makeup Sets",[46,7824,7825],{},[109,7826,7827],{},"Baby Jumping Exercisers",[46,7829,7830],{},[109,7831,7832],{},"Replacement Appliance Knobs",[46,7834,7835],{},[109,7836,7837],{},"Hair Removal Waxing Strips",[46,7839,7840],{},[109,7841,7842],{},"Toaster Ovens",[46,7844,7845],{},[109,7846,7847],{},"Electric Crepe Makers",[46,7849,7850],{},[109,7851,7852],{},"Kiteboard Control Lines",[46,7854,7855],{},[109,7856,7857],{},"Camera Cleaning Equipment",[46,7859,7860],{},[109,7861,7862],{},"Body Piercing Jewelry",[46,7864,7865],{},[109,7866,7867],{},"Weatherproofing Pipe Coverings",[46,7869,7870],{},[109,7871,7872],{},"Plant Misters",[46,7874,7875],{},[109,7876,7877],{},"Rosin Bags",[46,7879,7880],{},[109,7881,7882],{},"Plastic Cups",[46,7884,7885],{},[109,7886,7887],{},"Baby Bouncer & Rocker Chairs",[46,7889,7890],{},[109,7891,7892],{},"Washing Machines",[46,7894,7895],{},[109,7896,7897],{},"Ground Coffee",[46,7899,7900],{},[109,7901,7902],{},"Gun Mounts",[46,7904,7905],{},[109,7906,7907],{},"Remote Controls",[46,7909,7910],{},[109,7911,7912],{},"Medicine Dosing Containers",[46,7914,7915],{},[109,7916,7917],{},"Chainsaw Chains",[46,7919,7920],{},[109,7921,7922],{},"Climbing Slings",[46,7924,7925],{},[109,7926,7927],{},"Basketball Storage",[46,7929,7930],{},[109,7931,7932],{},"Writing Notebooks & Sketch Books",[46,7934,7935],{},[109,7936,7937],{},"Thermometer Probe Covers",[46,7939,7940],{},[109,7941,7942],{},"Wall Calendars",[46,7944,7945],{},[109,7946,7947],{},"Power Tool Batteries",[46,7949,7950],{},[109,7951,7952],{},"Corded Phones",[46,7954,7955],{},[109,7956,7957],{},"Desk Lamps",[46,7959,7960],{},[109,7961,7962],{},"Network-Attached Storage Servers",[46,7964,7965],{},[109,7966,7967],{},"Slatwall Panels",[46,7969,7970],{},[109,7971,7972],{},"Golf Push & Pull Carts",[46,7974,7975],{},[109,7976,7977],{},"Media Storage Cabinets",[46,7979,7980],{},[109,7981,7982],{},"Stovetop Waffle Irons",[46,7984,7985],{},[109,7986,7987],{},"Pet Tie-Outs",[46,7989,7990],{},[109,7991,7992],{},"Toilet Paper Holders",[46,7994,7995],{},[109,7996,7997],{},"Boating Heads",[46,7999,8000],{},[109,8001,8002],{},"Movie Cameras",[46,8004,8005],{},[109,8006,8007],{},"Vanity Lights",[46,8009,8010],{},[109,8011,8012],{},"Plaques & Signs",[46,8014,8015],{},[109,8016,8017],{},"Decorative Bottles",[46,8019,8020],{},[109,8021,8022],{},"Art Paint Sponges",[46,8024,8025],{},[109,8026,8027],{},"Kayak Carts",[46,8029,8030],{},[109,8031,8032],{},"Radar Detectors",[46,8034,8035],{},[109,8036,8037],{},"Outdoor Bar Stools",[46,8039,8040],{},[109,8041,8042],{},"Piggy Banks & Money Jars",[46,8044,8045],{},[109,8046,8047],{},"Fog Machines",[46,8049,8050],{},[109,8051,8052],{},"Food Storage Jars & Containers",[46,8054,8055],{},[109,8056,8057],{},"Pet ID Tags",[46,8059,8060],{},[109,8061,8062],{},"Salad Serving Utensils",[46,8064,8065],{},[109,8066,8067],{},"Bath Rugs",[46,8069,8070],{},[109,8071,8072],{},"Water Distillers",[46,8074,8075],{},[109,8076,8077],{},"Sewing Bias Tape",[46,8079,8080],{},[109,8081,8082],{},"Racquet Vibration Dampeners",[46,8084,8085],{},[109,8086,8087],{},"Live Shrubs",[46,8089,8090],{},[109,8091,8092],{},"Cable Tie Guns",[46,8094,8095],{},[109,8096,8097],{},"Floating Shelves",[46,8099,8100],{},[109,8101,8102],{},"Empty Camping Stove Fuel Bottles",[46,8104,8105],{},[109,8106,8107],{},"Toy Billiards",[46,8109,8110],{},[109,8111,8112],{},"Water Diverters",[46,8114,8115],{},[109,8116,8117],{},"Powdered Baking Cocoa",[46,8119,8120],{},[109,8121,8122],{},"Card Shufflers",[46,8124,8125],{},[109,8126,8127],{},"Tool Sets",[46,8129,8130],{},[109,8131,8132],{},"Paper Holders & Dispensers",[46,8134,8135],{},[109,8136,8137],{},"Bed-in-a-Bag",[46,8139,8140],{},[109,8141,8142],{},"Rail Planters",[46,8144,8145],{},[109,8146,8147],{},"Glass Markers & Stemware Charms",[46,8149,8150],{},[109,8151,8152],{},"Poison Ingestion Treatments",[46,8154,8155],{},[109,8156,8157],{},"Sewing Baskets",[46,8159,8160],{},[109,8161,8162],{},"Decorative Boxes",[46,8164,8165],{},[109,8166,8167],{},"Play Tents",[46,8169,8170],{},[109,8171,8172],{},"Oke Daiko Drums",[46,8174,8175],{},[109,8176,8177],{},"One-Piece Swimsuits",[46,8179,8180],{},[109,8181,8182],{},"Bicycle Stands",[46,8184,8185],{},[109,8186,8187],{},"Photography Flash Heads",[46,8189,8190],{},[109,8191,8192],{},"Yogurt Makers",[46,8194,8195],{},[109,8196,8197],{},"Field Hockey Goalie Hand Protectors",[46,8199,8200],{},[109,8201,8202],{},"Window Shades",[46,8204,8205],{},[109,8206,8207],{},"Camera Battery Grips",[46,8209,8210],{},[109,8211,8212],{},"Hunting Game Hoists & Gambrels",[46,8214,8215],{},[109,8216,8217],{},"Sunglass Visor Clips",[46,8219,8220],{},[109,8221,8222],{},"Christmas Trees",[46,8224,8225],{},[109,8226,8227],{},"Edge & Corner Guards",[46,8229,8230],{},[109,8231,8232],{},"Golf Carts",[46,8234,8235],{},[109,8236,8237],{},"Screen Houses",[46,8239,8240],{},[109,8241,8242],{},"Tent Poles",[46,8244,8245],{},[109,8246,8247],{},"Fish Cleaning Tables",[46,8249,8250],{},[109,8251,8252],{},"Bicycle Saddle Covers",[46,8254,8255],{},[109,8256,8257],{},"Plant Seeds",[46,8259,8260],{},[109,8261,8262],{},"Geographic Globes",[46,8264,8265],{},[109,8266,8267],{},"Jewelry Making Chain",[46,8269,8270],{},[109,8271,8272],{},"Figurines & Knick-Knacks",[46,8274,8275],{},[109,8276,8277],{},"Binder Insert Strips",[46,8279,8280],{},[109,8281,8282],{},"Hair Clipper Blades",[46,8284,8285],{},[109,8286,8287],{},"Nutrition Drinks",[46,8289,8290],{},[109,8291,8292],{},"Musical Bow Cases",[46,8294,8295],{},[109,8296,8297],{},"Glue Guns",[46,8299,8300],{},[109,8301,8302],{},"Breast Tape",[46,8304,8305],{},[109,8306,8307],{},"Automotive Lift Supports",[46,8309,8310],{},[109,8311,8312],{},"Acoustic Guitars",[46,8314,8315],{},[109,8316,8317],{},"Therapeutic Light Boxes",[46,8319,8320],{},[109,8321,8322],{},"Stovetop Espresso Pot Replacement Gaskets & Filters",[46,8324,8325],{},[109,8326,8327],{},"Beverage Tubs",[46,8329,8330],{},[109,8331,8332],{},"Lifeguard Swimsuits",[46,8334,8335],{},[109,8336,8337],{},"Other Backpacking & Camping Supplies",[46,8339,8340],{},[109,8341,8342],{},"Napkin Rings",[46,8344,8345],{},[109,8346,8347],{},"Staple Removers",[46,8349,8350],{},[109,8351,8352],{},"Gravy Boats, Stands & Sets",[46,8354,8355],{},[109,8356,8357],{},"Bath Pillows",[46,8359,8360],{},[109,8361,8362],{},"Easter Eggs",[46,8364,8365],{},[109,8366,8367],{},"Cut Flowers",[46,8369,8370],{},[109,8371,8372],{},"Traditional Abayas",[46,8374,8375],{},[109,8376,8377],{},"Air Guns",[46,8379,8380],{},[109,8381,8382],{},"Electric Fence Insulators",[46,8384,8385],{},[109,8386,8387],{},"SIM Cards",[46,8389,8390],{},[109,8391,8392],{},"Oven Mitts",[46,8394,8395],{},[109,8396,8397],{},"Gun Barrels",[46,8399,8400],{},[109,8401,8402],{},"Automotive Skid Plates",[46,8404,8405],{},[109,8406,8407],{},"Sport Starter Pistols",[46,8409,8410],{},[109,8411,8412],{},"Personal Misters",[46,8414,8415],{},[109,8416,8417],{},"Telescope Eyepiece & Filter Sets",[46,8419,8420],{},[109,8421,8422],{},"Cell Phone Radiation Guards",[46,8424,8425],{},[109,8426,8427],{},"Snowmobile Riser Blocks",[46,8429,8430],{},[109,8431,8432],{},"Football Target Nets",[46,8434,8435],{},[109,8436,8437],{},"Memory Card Adapters",[46,8439,8440],{},[109,8441,8442],{},"Mobility Walkers",[46,8444,8445],{},[109,8446,8447],{},"Ice Buckets",[46,8449,8450],{},[109,8451,8452],{},"Skins for Vape Pens",[46,8454,8455],{},[109,8456,8457],{},"Electrical Ballasts",[46,8459,8460],{},[109,8461,8462],{},"Bicycle Frames",[46,8464,8465],{},[109,8466,8467],{},"Cheese Wax",[46,8469,8470],{},[109,8471,8472],{},"Whole Bean Coffee",[46,8474,8475],{},[109,8476,8477],{},"Tennis Rebounders",[46,8479,8480],{},[109,8481,8482],{},"Plaster Hawks",[46,8484,8485],{},[109,8486,8487],{},"Dance Shoes",[46,8489,8490],{},[109,8491,8492],{},"Pizza Crusts",[46,8494,8495],{},[109,8496,8497],{},"Other Fireplaces Accessories",[46,8499,8500],{},[109,8501,8502],{},"Epoxy Coatings",[46,8504,8505],{},[109,8506,8507],{},"Automotive Trailers",[46,8509,8510],{},[109,8511,8512],{},"Gift Wrap Paper",[46,8514,8515],{},[109,8516,8517],{},"Material Handling Securing Straps",[46,8519,8520],{},[109,8521,8522],{},"Disposable Cameras",[46,8524,8525],{},[109,8526,8527],{},"Small Animal Exercise Wheels",[46,8529,8530],{},[109,8531,8532],{},"Hall Trees",[46,8534,8535],{},[109,8536,8537],{},"Cash Boxes",[46,8539,8540],{},[109,8541,8542],{},"Sprinkler Valves",[46,8544,8545],{},[109,8546,8547],{},"Renewable Energy Controllers",[46,8549,8550],{},[109,8551,8552],{},"Impact Drivers",[46,8554,8555],{},[109,8556,8557],{},"Home Brewing Grain & Hop Bags",[46,8559,8560],{},[109,8561,8562],{},"ATV Cargo Storage",[46,8564,8565],{},[109,8566,8567],{},"Bicycle Derailleurs",[46,8569,8570],{},[109,8571,8572],{},"Darkroom Squeegees",[46,8574,8575],{},[109,8576,8577],{},"Lens Supports",[46,8579,8580],{},[109,8581,8582],{},"Roller Stands",[46,8584,8585],{},[109,8586,8587],{},"Breath Fresheners",[46,8589,8590],{},[109,8591,8592],{},"Leaf & Plant Cleaner",[46,8594,8595],{},[109,8596,8597],{},"Cricket Balls",[46,8599,8600],{},[109,8601,8602],{},"Automotive Bumpers",[46,8604,8605],{},[109,8606,8607],{},"Other Baby Safety Supplies",[46,8609,8610],{},[109,8611,8612],{},"Confetti Poppers",[46,8614,8615],{},[109,8616,8617],{},"Swimsuit Sets",[46,8619,8620],{},[109,8621,8622],{},"Manual Pencil Sharpeners",[46,8624,8625],{},[109,8626,8627],{},"Toilet Bowls",[46,8629,8630],{},[109,8631,8632],{},"Art & Blueprint Tubes",[46,8634,8635],{},[109,8636,8637],{},"Air Fryer Liners",[46,8639,8640],{},[109,8641,8642],{},"Other Bicycle Parts",[46,8644,8645],{},[109,8646,8647],{},"Gymnastics Hand Grips",[46,8649,8650],{},[109,8651,8652],{},"Garlic Presses",[46,8654,8655],{},[109,8656,8657],{},"GPS Software",[46,8659,8660],{},[109,8661,8662],{},"Banana Hangers",[46,8664,8665],{},[109,8666,8667],{},"Animal Grooming Scissors",[46,8669,8670],{},[109,8671,8672],{},"Dining Tables",[46,8674,8675],{},[109,8676,8677],{},"DAT Recorders",[46,8679,8680],{},[109,8681,8682],{},"Decorative Bowls",[46,8684,8685],{},[109,8686,8687],{},"Dustpans & Dustpan & Brush Sets",[46,8689,8690],{},[109,8691,8692],{},"Racquet Sport Racquets",[46,8694,8695],{},[109,8696,8697],{},"Lap Guitars",[46,8699,8700],{},[109,8701,8702],{},"Construction Siding",[46,8704,8705],{},[109,8706,8707],{},"Baking Cups",[46,8709,8710],{},[109,8711,8712],{},"Hair Extensions",[46,8714,8715],{},[109,8716,8717],{},"Starting Fluid",[46,8719,8720],{},[109,8721,8722],{},"Chemical Solvents",[46,8724,8725],{},[109,8726,8727],{},"Pet Training Pad Trays",[46,8729,8730],{},[109,8731,8732],{},"Fishing Hook Sharpeners",[46,8734,8735],{},[109,8736,8737],{},"Other Construction Heating & Cooling Supplies",[46,8739,8740],{},[109,8741,8742],{},"Air Press Coffee Makers",[46,8744,8745],{},[109,8746,8747],{},"Playground Merry-Go-Rounds",[46,8749,8750],{},[109,8751,8752],{},"Clothes Iron Rests",[46,8754,8755],{},[109,8756,8757],{},"Coffee Drippers",[46,8759,8760],{},[109,8761,8762],{},"Microscope Mechanical Stages",[46,8764,8765],{},[109,8766,8767],{},"Makeup Palettes",[46,8769,8770],{},[109,8771,8772],{},"Fish Poachers & Bakers",[46,8774,8775],{},[109,8776,8777],{},"Power Screwdrivers",[46,8779,8780],{},[109,8781,8782],{},"Other Bowling Supplies",[46,8784,8785],{},[109,8786,8787],{},"Hardware Bolts",[46,8789,8790],{},[109,8791,8792],{},"Gymnastics Rings",[46,8794,8795],{},[109,8796,8797],{},"Other Occupational Health",[46,8799,8800],{},[109,8801,8802],{},"Automotive Glow Plugs",[46,8804,8805],{},[109,8806,8807],{},"Gun Stocks",[46,8809,8810],{},[109,8811,8812],{},"Ice Fishing Spearing Equipment",[46,8814,8815],{},[109,8816,8817],{},"Light Timers",[46,8819,8820],{},[109,8821,8822],{},"Plant Pots & Planters",[46,8824,8825],{},[109,8826,8827],{},"Camera Rain Covers",[46,8829,8830],{},[109,8831,8832],{},"Table Place Cards",[46,8834,8835],{},[109,8836,8837],{},"Door Closers",[46,8839,8840],{},[109,8841,8842],{},"Commercial Refrigerators",[46,8844,8845],{},[109,8846,8847],{},"Home Brewing Beer Bottle Caps",[46,8849,8850],{},[109,8851,8852],{},"Badge & ID Holders",[46,8854,8855],{},[109,8856,8857],{},"Interdental Brushes",[46,8859,8860],{},[109,8861,8862],{},"Facial Self-Tanners",[46,8864,8865],{},[109,8866,8867],{},"Archery Finger Tabs",[46,8869,8870],{},[109,8871,8872],{},"Hand Drills",[46,8874,8875],{},[109,8876,8877],{},"Cooking Sauces & Marinades",[46,8879,8880],{},[109,8881,8882],{},"Conductor",[16,8884],{},[67,8886,8888],{"id":8887},"walmart-category-metadata-field-mapping","Walmart Category Metadata Field Mapping",[19,8890,8891,8892,8894],{},"Use this table to understand what metadata fields are allowed for each ",[109,8893,2472],{},"  when creating items via Unified. Please note that these metadata fields are optional, while some categories do need specific metadata fields",[19,8896,8897],{},[1614,8898,8901],{"href":8899,"rel":8900},"https://prod-files-secure.s3.us-west-2.amazonaws.com/f6d0376b-d1d7-4f33-bff2-5d522d0db8dc/87d2c7a2-b0ec-47db-a30d-b5a3c79532e2/walmart_schema_fields.md?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB46627OXAUV4%2F20260203%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260203T202547Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEDwaCXVzLXdlc3QtMiJHMEUCIDcwb3GqFMY%2FL0AJfL3I%2FUaV5M9rbKJANmndDNP%2B3cvWAiEAhstHrJkItWTW8LOfcwCVzrIfvRAjHLMFyJfIfDU%2Bm5kq%2FwMIBRAAGgw2Mzc0MjMxODM4MDUiDA%2BtPXgWwEeVTi9f7ircAy8POF8SwjOULjsIQSqBd%2Fb2Sb6AYRzEosiUnG56PWPmdxaHm3k3mhZ98RpFVpH8CeB7bEprhu1JjUOsHo93G6SlQ3WFnekVfwsKTtQeZInDow6JHMH%2BMGm%2BY4yrZil9HtEvuEeXCcyLOpo4qxe%2FzygCd1LK5%2FFlF%2BufoVF3BNpKp7P0MtoXnCzFWs0MFxnCNa0rC852v5sNTAEu478oOshw%2BLFPjPGr4BN3oIlmMjDzWYHZY8%2BJiaJ2aGhByPelsH3KEkQRqC%2B40w3fkPcpLH77Np6vl31a0ex%2FRk5m7EV8FvHsTcnYMhH5svt21RR24xTmDstjj2oVRm5V%2FX8eJKX6kjKslRLNhw8d2M27UCF6OpxsqOnqS1LGxnS7rvxNgYanpAvdn7NkjmYFdDeRdeHbzEeENgxu2tF8SUoaDcf1Egcyu8YwxKCbGOxPibrKF%2BDwMky3VDx2sdvpK9jJZ0Eh8xGXgUcNOrCn4%2FGCvfOFp%2FtYposVMIUDbq%2B73dBoaHWeuGS3bdKKb66PIkZKRn05sTczh%2BrDXqXKMoZQoh5OvENP9IRrAgUYEl3Xk3aBgBURjrMHYmxdMVzNN%2BnNkGj7tyub25hYezxlEGmlYb69wGyILpxLIx7xqB%2FBMM%2BYicwGOqUBB0ea%2B5PQU0cqrDMLy%2BnMl9D9nPF2C7uGR2XYiEEFZBqU%2Bi2WTYMRsjeJA2Rx%2BTujp%2BvkhiPftP12AVrIQ2PyuO5gMUOPpxef782YG8379CUFQjyGeX4Fc9kUGvXjZfX%2F4mC0EJZpzKPETzLbvwNv9JwO%2BBKTKTCtkFdhzE1QBz5NRfnV5CuPgC8GEgMgB8OV70jCGmsqhgJKqb8T0ENHV0r%2BT2Io&X-Amz-Signature=8d40af48db880c5cd5ad6117b673bf0138e774a6347b8b3f26e646322b8e3999&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",[1618],"file",[16,8903],{},[35,8905,8907],{"id":8906},"sample-payload","Sample Payload",[102,8909,8911],{"className":2318,"code":8910,"language":2320,"meta":107,"style":107},"{\n  \"name\": \"Wireless Earphones with Advanced Features\",\n  \"slug\": \"09876543210987\",\n  \"global_code\": \"06146190200012\",\n  \"type\": \"Exterior Automotive Accessories\",\n  \"description\": \"Totally wireless earphones are built to revolutionize your workouts. The adjustable, secure-fit earhooks are customizable for extended comfort and stability. A reinforced design for sweat and water resistance lets you take it to the next level. Each earbud has full volume and track controls and up to 9 hours of listening time to fuel your training with powerful, balanced sound.\",\n  \"media\": [\n    {\n      \"url\": \"https://i5.walmartimages.com/seo/onn-Wireless-Bluetooth-on-Ear-Headphones-Black-New_07de2d93-505b-4902-8366-388a3f30e3b4.9375c5690645733ec080eef3f4895f7b.jpeg\"\n    }\n  ],\n  \"vendor_name\": \"Walmart\",\n  \"variants\": [\n    {\n      \"sku\": \"09876543210987\",\n      \"weight\": 0.57,\n      \"prices\": [\n        {\n          \"price\": 249.99\n        }\n      ]\n    }\n  ],\n  \"metadata\": {\n    \"productName\": \"Wireless Earphones with Advanced Features\",\n    \"brand\": \"Walmart\",\n    \"keyFeatures\": [\n      \"Designed to keep up with your workouts\",\n      \"Reinforced design for sweat and water resistance with adjustable, secure-fit earhooks for added comfort and stability.\",\n      \"Stay connected from a distance with Bluetooth technology, these wireless earphones deliver extended range and fewer dropouts.\",\n      \"Powers through long hours of training\"\n    ],\n    \"countPerPack\": 1,\n    \"multipackQuantity\": 1,\n    \"isProp65WarningRequired\": \"No\",\n    \"condition\": \"New\",\n    \"has_written_warranty\": \"Yes - Warranty Text\",\n    \"netContent\": {\n      \"productNetContentMeasure\": 1,\n      \"productNetContentUnit\": \"Each\"\n    },\n    \"productSecondaryImageURL\": [\n      \"https://i5.walmartimages.com/seo/onn-Wireless-Bluetooth-on-Ear-Headphones-Black-New_07de2d93-505b-4902-8366-388a3f30e3b4.9375c5690645733ec080eef3f4895f7b.jpeg\"\n    ],\n    \"assembledProductLength\": {\n      \"measure\": 4.33,\n      \"unit\": \"in\"\n    },\n    \"assembledProductHeight\": {\n      \"measure\": 4.33,\n      \"unit\": \"in\"\n    },\n    \"assembledProductWeight\": {\n      \"measure\": 0.57,\n      \"unit\": \"lb\"\n    },\n    \"assembledProductWidth\": {\n      \"measure\": 3.15,\n      \"unit\": \"in\"\n    },\n    \"prop65WarningText\": \"No\",\n    \"manufacturer\": \"Walmart\",\n    \"manufacturerPartNumber\": \"WM123456\",\n    \"count\": 1,\n    \"warrantyText\": \"1 Year\",\n    \"color\": \"Blue\",\n    \"aaiaBrandID\": \"WMTB\",\n    \"vehicle_fitment_type\": \"Specific\"\n  },\n  \"options\": {}\n}\n",[109,8912,8913,8917,8928,8940,8952,8964,8976,8983,8987,8997,9001,9006,9018,9025,9029,9040,9052,9059,9063,9073,9077,9081,9085,9089,9096,9107,9118,9125,9132,9139,9146,9151,9156,9168,9179,9191,9203,9215,9223,9235,9246,9251,9259,9265,9270,9278,9291,9302,9307,9315,9326,9335,9340,9348,9359,9369,9374,9382,9394,9403,9408,9420,9432,9445,9457,9470,9483,9496,9507,9513,9522],{"__ignoreMap":107},[112,8914,8915],{"class":114,"line":115},[112,8916,2327],{"class":236},[112,8918,8919,8921,8923,8926],{"class":114,"line":126},[112,8920,2357],{"class":129},[112,8922,2335],{"class":236},[112,8924,8925],{"class":122},"\"Wireless Earphones with Advanced Features\"",[112,8927,288],{"class":236},[112,8929,8930,8933,8935,8938],{"class":114,"line":135},[112,8931,8932],{"class":129},"  \"slug\"",[112,8934,2335],{"class":236},[112,8936,8937],{"class":122},"\"09876543210987\"",[112,8939,288],{"class":236},[112,8941,8942,8945,8947,8950],{"class":114,"line":147},[112,8943,8944],{"class":129},"  \"global_code\"",[112,8946,2335],{"class":236},[112,8948,8949],{"class":122},"\"06146190200012\"",[112,8951,288],{"class":236},[112,8953,8954,8957,8959,8962],{"class":114,"line":202},[112,8955,8956],{"class":129},"  \"type\"",[112,8958,2335],{"class":236},[112,8960,8961],{"class":122},"\"Exterior Automotive Accessories\"",[112,8963,288],{"class":236},[112,8965,8966,8969,8971,8974],{"class":114,"line":208},[112,8967,8968],{"class":129},"  \"description\"",[112,8970,2335],{"class":236},[112,8972,8973],{"class":122},"\"Totally wireless earphones are built to revolutionize your workouts. The adjustable, secure-fit earhooks are customizable for extended comfort and stability. A reinforced design for sweat and water resistance lets you take it to the next level. Each earbud has full volume and track controls and up to 9 hours of listening time to fuel your training with powerful, balanced sound.\"",[112,8975,288],{"class":236},[112,8977,8978,8981],{"class":114,"line":291},[112,8979,8980],{"class":129},"  \"media\"",[112,8982,2372],{"class":236},[112,8984,8985],{"class":114,"line":299},[112,8986,1076],{"class":236},[112,8988,8989,8992,8994],{"class":114,"line":307},[112,8990,8991],{"class":129},"      \"url\"",[112,8993,2335],{"class":236},[112,8995,8996],{"class":122},"\"https://i5.walmartimages.com/seo/onn-Wireless-Bluetooth-on-Ear-Headphones-Black-New_07de2d93-505b-4902-8366-388a3f30e3b4.9375c5690645733ec080eef3f4895f7b.jpeg\"\n",[112,8998,8999],{"class":114,"line":315},[112,9000,3946],{"class":236},[112,9002,9003],{"class":114,"line":323},[112,9004,9005],{"class":236},"  ],\n",[112,9007,9008,9011,9013,9016],{"class":114,"line":329},[112,9009,9010],{"class":129},"  \"vendor_name\"",[112,9012,2335],{"class":236},[112,9014,9015],{"class":122},"\"Walmart\"",[112,9017,288],{"class":236},[112,9019,9020,9023],{"class":114,"line":341},[112,9021,9022],{"class":129},"  \"variants\"",[112,9024,2372],{"class":236},[112,9026,9027],{"class":114,"line":346},[112,9028,1076],{"class":236},[112,9030,9031,9034,9036,9038],{"class":114,"line":366},[112,9032,9033],{"class":129},"      \"sku\"",[112,9035,2335],{"class":236},[112,9037,8937],{"class":122},[112,9039,288],{"class":236},[112,9041,9042,9045,9047,9050],{"class":114,"line":381},[112,9043,9044],{"class":129},"      \"weight\"",[112,9046,2335],{"class":236},[112,9048,9049],{"class":129},"0.57",[112,9051,288],{"class":236},[112,9053,9054,9057],{"class":114,"line":387},[112,9055,9056],{"class":129},"      \"prices\"",[112,9058,2372],{"class":236},[112,9060,9061],{"class":114,"line":392},[112,9062,4001],{"class":236},[112,9064,9065,9068,9070],{"class":114,"line":409},[112,9066,9067],{"class":129},"          \"price\"",[112,9069,2335],{"class":236},[112,9071,9072],{"class":129},"249.99\n",[112,9074,9075],{"class":114,"line":422},[112,9076,4052],{"class":236},[112,9078,9079],{"class":114,"line":435},[112,9080,3941],{"class":236},[112,9082,9083],{"class":114,"line":440},[112,9084,3946],{"class":236},[112,9086,9087],{"class":114,"line":4949},[112,9088,9005],{"class":236},[112,9090,9091,9094],{"class":114,"line":4960},[112,9092,9093],{"class":129},"  \"metadata\"",[112,9095,3888],{"class":236},[112,9097,9098,9101,9103,9105],{"class":114,"line":4972},[112,9099,9100],{"class":129},"    \"productName\"",[112,9102,2335],{"class":236},[112,9104,8925],{"class":122},[112,9106,288],{"class":236},[112,9108,9109,9112,9114,9116],{"class":114,"line":4984},[112,9110,9111],{"class":129},"    \"brand\"",[112,9113,2335],{"class":236},[112,9115,9015],{"class":122},[112,9117,288],{"class":236},[112,9119,9120,9123],{"class":114,"line":4992},[112,9121,9122],{"class":129},"    \"keyFeatures\"",[112,9124,2372],{"class":236},[112,9126,9127,9130],{"class":114,"line":5000},[112,9128,9129],{"class":122},"      \"Designed to keep up with your workouts\"",[112,9131,288],{"class":236},[112,9133,9134,9137],{"class":114,"line":5008},[112,9135,9136],{"class":122},"      \"Reinforced design for sweat and water resistance with adjustable, secure-fit earhooks for added comfort and stability.\"",[112,9138,288],{"class":236},[112,9140,9141,9144],{"class":114,"line":5016},[112,9142,9143],{"class":122},"      \"Stay connected from a distance with Bluetooth technology, these wireless earphones deliver extended range and fewer dropouts.\"",[112,9145,288],{"class":236},[112,9147,9148],{"class":114,"line":5024},[112,9149,9150],{"class":122},"      \"Powers through long hours of training\"\n",[112,9152,9153],{"class":114,"line":5032},[112,9154,9155],{"class":236},"    ],\n",[112,9157,9158,9161,9163,9166],{"class":114,"line":5040},[112,9159,9160],{"class":129},"    \"countPerPack\"",[112,9162,2335],{"class":236},[112,9164,9165],{"class":129},"1",[112,9167,288],{"class":236},[112,9169,9170,9173,9175,9177],{"class":114,"line":5046},[112,9171,9172],{"class":129},"    \"multipackQuantity\"",[112,9174,2335],{"class":236},[112,9176,9165],{"class":129},[112,9178,288],{"class":236},[112,9180,9181,9184,9186,9189],{"class":114,"line":5052},[112,9182,9183],{"class":129},"    \"isProp65WarningRequired\"",[112,9185,2335],{"class":236},[112,9187,9188],{"class":122},"\"No\"",[112,9190,288],{"class":236},[112,9192,9193,9196,9198,9201],{"class":114,"line":5061},[112,9194,9195],{"class":129},"    \"condition\"",[112,9197,2335],{"class":236},[112,9199,9200],{"class":122},"\"New\"",[112,9202,288],{"class":236},[112,9204,9205,9208,9210,9213],{"class":114,"line":5066},[112,9206,9207],{"class":129},"    \"has_written_warranty\"",[112,9209,2335],{"class":236},[112,9211,9212],{"class":122},"\"Yes - Warranty Text\"",[112,9214,288],{"class":236},[112,9216,9218,9221],{"class":114,"line":9217},38,[112,9219,9220],{"class":129},"    \"netContent\"",[112,9222,3888],{"class":236},[112,9224,9226,9229,9231,9233],{"class":114,"line":9225},39,[112,9227,9228],{"class":129},"      \"productNetContentMeasure\"",[112,9230,2335],{"class":236},[112,9232,9165],{"class":129},[112,9234,288],{"class":236},[112,9236,9238,9241,9243],{"class":114,"line":9237},40,[112,9239,9240],{"class":129},"      \"productNetContentUnit\"",[112,9242,2335],{"class":236},[112,9244,9245],{"class":122},"\"Each\"\n",[112,9247,9249],{"class":114,"line":9248},41,[112,9250,988],{"class":236},[112,9252,9254,9257],{"class":114,"line":9253},42,[112,9255,9256],{"class":129},"    \"productSecondaryImageURL\"",[112,9258,2372],{"class":236},[112,9260,9262],{"class":114,"line":9261},43,[112,9263,9264],{"class":122},"      \"https://i5.walmartimages.com/seo/onn-Wireless-Bluetooth-on-Ear-Headphones-Black-New_07de2d93-505b-4902-8366-388a3f30e3b4.9375c5690645733ec080eef3f4895f7b.jpeg\"\n",[112,9266,9268],{"class":114,"line":9267},44,[112,9269,9155],{"class":236},[112,9271,9273,9276],{"class":114,"line":9272},45,[112,9274,9275],{"class":129},"    \"assembledProductLength\"",[112,9277,3888],{"class":236},[112,9279,9281,9284,9286,9289],{"class":114,"line":9280},46,[112,9282,9283],{"class":129},"      \"measure\"",[112,9285,2335],{"class":236},[112,9287,9288],{"class":129},"4.33",[112,9290,288],{"class":236},[112,9292,9294,9297,9299],{"class":114,"line":9293},47,[112,9295,9296],{"class":129},"      \"unit\"",[112,9298,2335],{"class":236},[112,9300,9301],{"class":122},"\"in\"\n",[112,9303,9305],{"class":114,"line":9304},48,[112,9306,988],{"class":236},[112,9308,9310,9313],{"class":114,"line":9309},49,[112,9311,9312],{"class":129},"    \"assembledProductHeight\"",[112,9314,3888],{"class":236},[112,9316,9318,9320,9322,9324],{"class":114,"line":9317},50,[112,9319,9283],{"class":129},[112,9321,2335],{"class":236},[112,9323,9288],{"class":129},[112,9325,288],{"class":236},[112,9327,9329,9331,9333],{"class":114,"line":9328},51,[112,9330,9296],{"class":129},[112,9332,2335],{"class":236},[112,9334,9301],{"class":122},[112,9336,9338],{"class":114,"line":9337},52,[112,9339,988],{"class":236},[112,9341,9343,9346],{"class":114,"line":9342},53,[112,9344,9345],{"class":129},"    \"assembledProductWeight\"",[112,9347,3888],{"class":236},[112,9349,9351,9353,9355,9357],{"class":114,"line":9350},54,[112,9352,9283],{"class":129},[112,9354,2335],{"class":236},[112,9356,9049],{"class":129},[112,9358,288],{"class":236},[112,9360,9362,9364,9366],{"class":114,"line":9361},55,[112,9363,9296],{"class":129},[112,9365,2335],{"class":236},[112,9367,9368],{"class":122},"\"lb\"\n",[112,9370,9372],{"class":114,"line":9371},56,[112,9373,988],{"class":236},[112,9375,9377,9380],{"class":114,"line":9376},57,[112,9378,9379],{"class":129},"    \"assembledProductWidth\"",[112,9381,3888],{"class":236},[112,9383,9385,9387,9389,9392],{"class":114,"line":9384},58,[112,9386,9283],{"class":129},[112,9388,2335],{"class":236},[112,9390,9391],{"class":129},"3.15",[112,9393,288],{"class":236},[112,9395,9397,9399,9401],{"class":114,"line":9396},59,[112,9398,9296],{"class":129},[112,9400,2335],{"class":236},[112,9402,9301],{"class":122},[112,9404,9406],{"class":114,"line":9405},60,[112,9407,988],{"class":236},[112,9409,9411,9414,9416,9418],{"class":114,"line":9410},61,[112,9412,9413],{"class":129},"    \"prop65WarningText\"",[112,9415,2335],{"class":236},[112,9417,9188],{"class":122},[112,9419,288],{"class":236},[112,9421,9423,9426,9428,9430],{"class":114,"line":9422},62,[112,9424,9425],{"class":129},"    \"manufacturer\"",[112,9427,2335],{"class":236},[112,9429,9015],{"class":122},[112,9431,288],{"class":236},[112,9433,9435,9438,9440,9443],{"class":114,"line":9434},63,[112,9436,9437],{"class":129},"    \"manufacturerPartNumber\"",[112,9439,2335],{"class":236},[112,9441,9442],{"class":122},"\"WM123456\"",[112,9444,288],{"class":236},[112,9446,9448,9451,9453,9455],{"class":114,"line":9447},64,[112,9449,9450],{"class":129},"    \"count\"",[112,9452,2335],{"class":236},[112,9454,9165],{"class":129},[112,9456,288],{"class":236},[112,9458,9460,9463,9465,9468],{"class":114,"line":9459},65,[112,9461,9462],{"class":129},"    \"warrantyText\"",[112,9464,2335],{"class":236},[112,9466,9467],{"class":122},"\"1 Year\"",[112,9469,288],{"class":236},[112,9471,9473,9476,9478,9481],{"class":114,"line":9472},66,[112,9474,9475],{"class":129},"    \"color\"",[112,9477,2335],{"class":236},[112,9479,9480],{"class":122},"\"Blue\"",[112,9482,288],{"class":236},[112,9484,9486,9489,9491,9494],{"class":114,"line":9485},67,[112,9487,9488],{"class":129},"    \"aaiaBrandID\"",[112,9490,2335],{"class":236},[112,9492,9493],{"class":122},"\"WMTB\"",[112,9495,288],{"class":236},[112,9497,9499,9502,9504],{"class":114,"line":9498},68,[112,9500,9501],{"class":129},"    \"vehicle_fitment_type\"",[112,9503,2335],{"class":236},[112,9505,9506],{"class":122},"\"Specific\"\n",[112,9508,9510],{"class":114,"line":9509},69,[112,9511,9512],{"class":236},"  },\n",[112,9514,9516,9519],{"class":114,"line":9515},70,[112,9517,9518],{"class":129},"  \"options\"",[112,9520,9521],{"class":236},": {}\n",[112,9523,9525],{"class":114,"line":9524},71,[112,9526,584],{"class":236},[19,9528,9529,9532,9533,9536,9537,9540,9541,9546,9547,9552],{},[478,9530,9531],{},"NOTE",": If item creation ",[478,9534,9535],{},"fails"," or takes ",[478,9538,9539],{},"too long"," to process, the ",[478,9542,9543],{},[109,9544,9545],{},"feed ID"," and any ",[478,9548,9549],{},[109,9550,9551],{},"error details"," will be returned in the error response.",[19,9554,9555,9556,2251,9559,2251,9563],{},"⚠️ ",[478,9557,9558],{},"Important Note on Reading",[478,9560,9561],{},[109,9562,4571],{},[478,9564,9565],{},"Data via Walmart's GET and LIST APIs",[19,9567,9568,9569,9571,9572,9575,9576,9578,9579,9582],{},"When using Walmart's ",[478,9570,2712],{}," or ",[478,9573,9574],{},"LIST"," endpoints to retrieve ",[109,9577,4571],{}," records (i.e., your catalog items), ",[478,9580,9581],{},"you will only receive a subset of the full item",". This limitation is imposed by Walmart's public Marketplace APIs and is not configurable.",[35,9584,9586],{"id":9585},"whats-missing","What's Missing?",[72,9588,9589,9615],{},[46,9590,9591,9592,9597,9598,1046,9601,1046,9604,1046,9607,9610,9611,9614],{},"Fields defined in the ",[478,9593,9594],{},[109,9595,9596],{},"Visible"," section of your original item feed (e.g., ",[109,9599,9600],{},"animalLifestage",[109,9602,9603],{},"assembledProductWeight",[109,9605,9606],{},"features",[109,9608,9609],{},"fabricContent",", etc.) will ",[478,9612,9613],{},"not be returned"," in full.",[46,9616,9617,9618,634],{},"Walmart truncates or omits many ",[478,9619,9620],{},"category-specific structured attributes",[35,9622,9624],{"id":9623},"why-this-happens","Why This Happens:",[19,9626,9627],{},"Walmart's GET/LIST endpoints are designed for high-level overviews or simple listing needs, not for reconstructing detailed item payloads. They surface:",[72,9629,9630,9633,9636],{},[46,9631,9632],{},"Basic identifiers (e.g., SKU, productName)",[46,9634,9635],{},"Core logistics info (e.g., price, inventory, brand)",[46,9637,9638,9639,9642],{},"A ",[22,9640,9641],{},"limited set"," of visible attributes",[1558,9644,9645],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":9647},[9648,9649,9650,9652],{"id":4581,"depth":135,"text":4582},{"id":4642,"depth":135,"text":4643},{"id":5077,"depth":135,"text":9651},"Supported type Values for Walmart Items (commerce_item)",{"id":8887,"depth":126,"text":8888,"children":9653},[9654,9655,9656],{"id":8906,"depth":135,"text":8907},{"id":9585,"depth":135,"text":9586},{"id":9623,"depth":135,"text":9624},"Unified allows you to create structured product listings on Walmart Marketplace via our Unified data model `commerceitem`. This guide explains the critical...",{"img":9659,"date":9660,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/creating_walmart_items_via_unified-icon.png","2025-07-31T00:00:00.000Z","/guides/creating_walmart_items_via_unified",{"title":4549,"description":9657},"guides/creating_walmart_items_via_unified","B3bYXXketPWlJrWcoF1Z5s36z7X7QadVNuIczQnmV48",{"id":9666,"title":9667,"body":9668,"description":10220,"extension":1576,"meta":10221,"navigation":271,"path":10224,"seo":10225,"stem":10226,"__hash__":10227},"guides/guides/end_users_integrations_and_connections.md","End-Users, Integrations, and Connections",{"type":9,"value":9669,"toc":10198},[9670,9673,9675,9680,9687,9691,9694,9714,9720,9724,9727,9731,9761,9764,9771,9775,9778,9782,9789,9803,9806,9822,9826,9829,9832,9843,9846,9850,9853,9861,9868,9875,9879,9882,9886,9889,9912,9915,9919,9922,9946,9949,10043,10047,10050,10064,10072,10076,10125,10129,10132,10136,10147,10151,10162,10170,10174,10195],[12,9671,9667],{"id":9672},"end-users-integrations-and-connections",[16,9674],{},[19,9676,9677],{},[22,9678,9679],{},"April 18, 2024",[19,9681,9682,9683,9686],{},"This guide explains how connections work at ",[1614,9684,1640],{"href":1638,"rel":9685},[1618]," and shows you different ways to create connections for your application. You'll learn about the relationship between your end-users, connections, and integrations, as well as how to get started quickly with test connections.",[67,9688,9690],{"id":9689},"overview","Overview",[19,9692,9693],{},"At Unified.to, there are three key concepts to understand:",[43,9695,9696,9702,9708],{},[46,9697,9698,9701],{},[478,9699,9700],{},"Integrations"," - These are the bridges between your application and third-party platforms (a.k.a SaaS apps). These are pre-built for you!",[46,9703,9704,9707],{},[478,9705,9706],{},"Connections"," - These are the authorized links between your end-users and specific integrations",[46,9709,9710,9713],{},[478,9711,9712],{},"End-users"," - These are your application's users whose data you will access from their accounts i.e. HubSpots, Salesforce, Shopify, and so on.",[19,9715,9716],{},[1603,9717],{"alt":9718,"src":9719},"Users_connections_and_integrations_%2810%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/end_users_integrations_and_connections-0.png",[67,9721,9723],{"id":9722},"understanding-integrations","Understanding integrations",[19,9725,9726],{},"Your application communicates with a SaaS application through an integration.",[35,9728,9730],{"id":9729},"activating-an-integration-in-the-sandbox-environment","Activating an integration in the sandbox environment",[43,9732,9733,9744,9747,9755],{},[46,9734,9735,9736,9738,9739],{},"Navigate to ",[478,9737,9700],{}," at ",[1614,9740,9743],{"href":9741,"rel":9742},"https://app.unified.to/integrations",[1618],"app.unified.to/integrations",[46,9745,9746],{},"Search for the integration you want to use",[46,9748,9749,9750],{},"Click on the integration card to view its details\n",[43,9751,9752],{},[46,9753,9754],{},"For sandbox environment integrations, you don't need to enter any real credentials here.",[46,9756,9757,9758],{},"Click ",[478,9759,9760],{},"Activate",[19,9762,9763],{},"All data is synthetic in the sandbox environment, meaning you don't need to sign up for any third-party accounts while you're testing the Unified.to platform.",[19,9765,9766],{},[1614,9767,9770],{"href":9768,"rel":9769},"https://docs.unified.to/concepts/sandbox",[1618],"Learn more about the sandbox environment →",[35,9772,9774],{"id":9773},"activating-an-integration-in-production-environments","Activating an integration in production environments",[19,9776,9777],{},"To activate an integration in production environments, you'll need developer credentials from the platform you're integrating with.",[35,9779,9781],{"id":9780},"developer-credentials","Developer credentials",[19,9783,9784,9785,9788],{},"When activating an integration, you'll be asked to provide credentials like API keys or OAuth 2.0 client IDs and secrets. These credentials should come from ",[478,9786,9787],{},"your developer account"," with the platform, not your end-users' accounts. Here's how it works:",[43,9790,9791,9794,9797,9800],{},[46,9792,9793],{},"You register your application with the platform (e.g., create a HubSpot developer account and register your app)",[46,9795,9796],{},"You receive developer credentials that identify your application",[46,9798,9799],{},"You enter these credentials when activating the integration on Unified.to",[46,9801,9802],{},"Your end-users will later authorize your application to access their accounts, with or without using their own credentials (depends on the type of auth flow)",[19,9804,9805],{},"For example, if you're building an interview scheduling platform that needs to access your clients' Zoho CRM data:",[72,9807,9808,9815],{},[46,9809,9810,9811,9814],{},"You use ",[478,9812,9813],{},"your"," Zoho developer account credentials to activate the integration",[46,9816,9817,9818,9821],{},"Your ",[478,9819,9820],{},"end-users"," will authorize access to their Zoho CRM accounts when creating connections by consenting to give you access to their data",[67,9823,9825],{"id":9824},"understanding-connections","Understanding connections",[19,9827,9828],{},"Your end-users are connected to integrations through connections_._",[19,9830,9831],{},"A connection is an authorized link between one of your end-users and a specific integration. For example, if your application needs to access a user's HubSpot account, you'll need:",[43,9833,9834,9837,9840],{},[46,9835,9836],{},"The HubSpot integration to be activated in your workspace",[46,9838,9839],{},"A connection between that specific user and HubSpot",[46,9841,9842],{},"The correct scope configuration for what data you need to access",[19,9844,9845],{},"Each user needs their own connection to each integration you want to use. This ensures proper authorization and data isolation between users.",[35,9847,9849],{"id":9848},"about-scopes","About scopes",[19,9851,9852],{},"Scopes determine what data your application can access in your end-users' accounts. You need to:",[43,9854,9855,9858],{},[46,9856,9857],{},"Configure the correct scopes in your developer account with the platform",[46,9859,9860],{},"Select the corresponding Unified.to scopes when setting up your integration",[19,9862,9863,9864,9867],{},"For example, if you need to read CRM contacts, you would request the ",[109,9865,9866],{},"crm_contact_read"," scope. Unified.to has its own set of scopes (called Unified scopes) which have been mapped to the corresponding scopes for every single integration that needs them. When requesting scopes, you only need to pass in Unified scopes in addition to enabling those scopes in your developer account.",[19,9869,9870],{},[1614,9871,9874],{"href":9872,"rel":9873},"https://docs.unified.to/concepts/scopes",[1618],"Learn more about configuring scopes →",[67,9876,9878],{"id":9877},"how-to-create-connections","How to create connections",[19,9880,9881],{},"There are three main ways to create connections in Unified.to, each suited for different scenarios:",[35,9883,9885],{"id":9884},"_1-development-and-testing-create-test-connections-in-the-sandbox-environment","1. Development and testing: Create test connections in the sandbox environment",[19,9887,9888],{},"This is the fastest way to get started and test integrations:",[43,9890,9891,9898,9904,9909],{},[46,9892,9893,9894,9897],{},"Switch to the ",[478,9895,9896],{},"Sandbox"," environment in the Unified.to app",[46,9899,9900,9901,9903],{},"Go to the ",[478,9902,9706],{}," page",[46,9905,9757,9906],{},[478,9907,9908],{},"Create test connection",[46,9910,9911],{},"Select any activated integration you want to test",[19,9913,9914],{},"Test connections are created instantly with mock credentials, perfect for development and testing.",[35,9916,9918],{"id":9917},"_2-production-ready-use-the-authorization-embedded-component","2. Production ready: Use the Authorization embedded component",[19,9920,9921],{},"This is the recommended approach for production-ready applications:",[43,9923,9924,9934,9937,9940,9943],{},[46,9925,9926,9927,9903],{},"Navigate to the ",[1614,9928,9931],{"href":9929,"rel":9930},"https://app.unified.to/embed",[1618],[478,9932,9933],{},"Embedded Authorization",[46,9935,9936],{},"Configure your callback settings, permission scopes, and display options",[46,9938,9939],{},"Copy the provided code snippet for your preferred tool (React, Angular, Vue, vanilla JavaScript, or an API call)",[46,9941,9942],{},"Add the code to your application",[46,9944,9945],{},"The Authorization component will be rendered on your app. When users click an integration's logo, they'll be guided through the authorization process",[19,9947,9948],{},"Example code for React:",[102,9950,9954],{"className":9951,"code":9952,"language":9953,"meta":107,"style":107},"language-javascript shiki shiki-themes github-dark github-dark github-light","import UnifiedDirectory from '@unified-api/react-directory';\n\nfunction App() {\n  return (\n    \u003CUnifiedDirectory\n      workspaceId=\"{WORKSPACE_ID}\"\n      environmentId=\"{ENVIRONMENT}\"\n      success_redirect=\"{SUCCESS_URL}\"\n    />\n  );\n}\n","javascript",[109,9955,9956,9970,9974,9984,9991,9999,10009,10019,10029,10034,10039],{"__ignoreMap":107},[112,9957,9958,9960,9963,9965,9968],{"class":114,"line":115},[112,9959,230],{"class":229},[112,9961,9962],{"class":236}," UnifiedDirectory ",[112,9964,247],{"class":229},[112,9966,9967],{"class":122}," '@unified-api/react-directory'",[112,9969,237],{"class":236},[112,9971,9972],{"class":114,"line":126},[112,9973,272],{"emptyLinePlaceholder":271},[112,9975,9976,9979,9982],{"class":114,"line":135},[112,9977,9978],{"class":229},"function",[112,9980,9981],{"class":118}," App",[112,9983,1385],{"class":236},[112,9985,9986,9988],{"class":114,"line":147},[112,9987,621],{"class":229},[112,9989,9990],{"class":236}," (\n",[112,9992,9993,9996],{"class":114,"line":202},[112,9994,9995],{"class":236},"    \u003C",[112,9997,9998],{"class":129},"UnifiedDirectory\n",[112,10000,10001,10004,10006],{"class":114,"line":208},[112,10002,10003],{"class":118},"      workspaceId",[112,10005,335],{"class":229},[112,10007,10008],{"class":122},"\"{WORKSPACE_ID}\"\n",[112,10010,10011,10014,10016],{"class":114,"line":291},[112,10012,10013],{"class":118},"      environmentId",[112,10015,335],{"class":229},[112,10017,10018],{"class":122},"\"{ENVIRONMENT}\"\n",[112,10020,10021,10024,10026],{"class":114,"line":299},[112,10022,10023],{"class":118},"      success_redirect",[112,10025,335],{"class":229},[112,10027,10028],{"class":122},"\"{SUCCESS_URL}\"\n",[112,10030,10031],{"class":114,"line":307},[112,10032,10033],{"class":236},"    />\n",[112,10035,10036],{"class":114,"line":315},[112,10037,10038],{"class":236},"  );\n",[112,10040,10041],{"class":114,"line":323},[112,10042,584],{"class":236},[35,10044,10046],{"id":10045},"_3-custom-implementation-build-your-own-authorization-flow","3. Custom implementation: Build your own authorization flow",[19,10048,10049],{},"For greater control over the user experience:",[43,10051,10052,10055,10058,10061],{},[46,10053,10054],{},"Fetch available integrations using the Unified API",[46,10056,10057],{},"Create authorization URLs for selected integrations",[46,10059,10060],{},"Handle authorization callbacks",[46,10062,10063],{},"Manage connection IDs",[19,10065,10066,10067,634],{},"This approach requires slightly more implementation work but offers more flexibility. You can find a ",[1614,10068,10071],{"href":10069,"rel":10070},"https://docs.unified.to/tutorials/customize-auth-flow",[1618],"complete tutorial for this approach in our documentation",[67,10073,10075],{"id":10074},"best-practices","Best practices",[72,10077,10078,10084,10090,10101,10113,10119],{},[46,10079,10080,10083],{},[478,10081,10082],{},"Always test in Sandbox first",": Use test connections to validate your integration logic",[46,10085,10086,10089],{},[478,10087,10088],{},"Store connection IDs securely",": Never store connection IDs in client-side storage in production",[46,10091,10092,10095,10096,634],{},[478,10093,10094],{},"Handle authorization failures gracefully",": Provide clear feedback when connection attempts fail. Users will be redirected to the failure URL you specified during configuration. ",[1614,10097,10100],{"href":10098,"rel":10099},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_connections#handle-errors-during-connection-creation",[1618],"Learn more about handling failure callbacks here",[46,10102,10103,10106,10107,10112],{},[478,10104,10105],{},"Monitor connection health",": Set up ",[1614,10108,10111],{"href":10109,"rel":10110},"https://app.unified.to/settings/workspace",[1618],"webhook notifications"," for connection status changes",[46,10114,10115,10118],{},[478,10116,10117],{},"Configure scopes correctly",": Request only the permissions your application needs",[46,10120,10121,10124],{},[478,10122,10123],{},"Use separate environments",": Keep your development and production environments separate",[67,10126,10128],{"id":10127},"troubleshooting","Troubleshooting",[19,10130,10131],{},"Common issues and solutions:",[35,10133,10135],{"id":10134},"connection-creation-fails","Connection creation fails",[72,10137,10138,10141,10144],{},[46,10139,10140],{},"Verify your developer credentials are correct",[46,10142,10143],{},"Check that required scopes are configured both in your platform developer account and Unified.to",[46,10145,10146],{},"Ensure redirect URLs are properly set up in your platform developer settings",[35,10148,10150],{"id":10149},"authorization-flow-issues","Authorization flow issues",[72,10152,10153,10156,10159],{},[46,10154,10155],{},"Confirm your integration is activated",[46,10157,10158],{},"Verify environment settings (Sandbox vs Production)",[46,10160,10161],{},"Check that scopes match between your platform developer account and Unified.to",[19,10163,10164,10165],{},"For more guidance, see: ",[1614,10166,10169],{"href":10167,"rel":10168},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_connections",[1618],"How to troubleshoot unhealthy connections",[67,10171,10173],{"id":10172},"next-steps","Next steps",[72,10175,10176,10179,10188],{},[46,10177,10178],{},"Try creating your first test connection in the sandbox environment",[46,10180,10181,10182,10187],{},"Explore our ",[1614,10183,10186],{"href":10184,"rel":10185},"https://docs.unified.to/quick-start",[1618],"Quickstart guide"," for a hands-on example",[46,10189,10190,10191],{},"Read our detailed guide on ",[1614,10192,10194],{"href":9872,"rel":10193},[1618],"understanding and configuring scopes",[1558,10196,10197],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":10199},[10200,10201,10206,10209,10214,10215,10219],{"id":9689,"depth":126,"text":9690},{"id":9722,"depth":126,"text":9723,"children":10202},[10203,10204,10205],{"id":9729,"depth":135,"text":9730},{"id":9773,"depth":135,"text":9774},{"id":9780,"depth":135,"text":9781},{"id":9824,"depth":126,"text":9825,"children":10207},[10208],{"id":9848,"depth":135,"text":9849},{"id":9877,"depth":126,"text":9878,"children":10210},[10211,10212,10213],{"id":9884,"depth":135,"text":9885},{"id":9917,"depth":135,"text":9918},{"id":10045,"depth":135,"text":10046},{"id":10074,"depth":126,"text":10075},{"id":10127,"depth":126,"text":10128,"children":10216},[10217,10218],{"id":10134,"depth":135,"text":10135},{"id":10149,"depth":135,"text":10150},{"id":10172,"depth":126,"text":10173},"This guide explains how connections work at Unified.to and shows you different ways to create connections for your application. You'll learn about the...",{"img":10222,"date":10223,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/end_users_integrations_and_connections-icon.png","2024-04-18T00:00:00.000Z","/guides/end_users_integrations_and_connections",{"title":9667,"description":10220},"guides/end_users_integrations_and_connections","ldVa-Yb5Qtn6JxO0qv10mwPGJjUrMtxiAQxXKoIl8Zk",{"id":10229,"title":10230,"body":10231,"description":11278,"extension":1576,"meta":11279,"navigation":271,"path":11282,"seo":11283,"stem":11284,"__hash__":11285},"guides/guides/enriching_unified_objects_with_custom_metadata.md","Enriching Unified Objects with Custom Metadata",{"type":9,"value":10232,"toc":11255},[10233,10236,10238,10243,10245,10261,10264,10266,10269,10281,10283,10287,10469,10471,10474,10479,10485,10505,10514,10516,10521,10524,10591,10593,10598,10604,10657,10660,10662,10666,10675,10682,10801,10803,10807,10814,10821,10845,10895,10897,10901,10904,10977,10979,10983,11054,11057,11061,11064,11166,11175,11177,11181,11191,11202,11204,11208,11252],[12,10234,10230],{"id":10235},"enriching-unified-objects-with-custom-metadata",[16,10237],{},[19,10239,10240],{},[22,10241,10242],{},"July 23, 2025",[67,10244,9690],{"id":9689},[19,10246,10247,10248,10251,10252,1046,10254,1046,10257,10260],{},"The metadata_metadata object is a powerful addition to the Unified data model. It enables the definition of ",[478,10249,10250],{},"metadata schemas (custom fields)"," that can be attached to various unified objects—such as ",[109,10253,4571],{},[109,10255,10256],{},"ats_job",[109,10258,10259],{},"hris_employee",", and more.",[19,10262,10263],{},"This document explains its structure, how to use it effectively, and best practices for managing dynamic metadata across models.",[16,10265],{},[67,10267,2046],{"id":10268},"purpose",[19,10270,10271,10273,10274,10277,10278,10280],{},[109,10272,4708],{}," serves as a ",[478,10275,10276],{},"schema registry"," for custom fields, allowing users to enrich objects with reusable, structured metadata. These definitions dictate the format and structure of metadata values that live inside the ",[109,10279,4631],{}," field of supported Unified objects.",[16,10282],{},[67,10284,10286],{"id":10285},"object-structure","Object Structure",[102,10288,10290],{"className":220,"code":10289,"language":222,"meta":107,"style":107},"interface IMetadataMetadata {\n  id?: string;\n  created_at?: (string | Date | number);\n  updated_at?: (string | Date | number);\n  name: string; // Required\n  slug?: string;\n  format?: string; // One of the supported formats\n  original_format?: string;\n  options?: string[];\n  object_type: string; // e.g. 'commerce_item', 'ats_job'\n  objects?: { [objectType: string]: string[] }; // Map of object_type to object IDs\n}\n",[109,10291,10292,10302,10314,10337,10358,10373,10384,10398,10409,10421,10435,10465],{"__ignoreMap":107},[112,10293,10294,10297,10300],{"class":114,"line":115},[112,10295,10296],{"class":229},"interface",[112,10298,10299],{"class":118}," IMetadataMetadata",[112,10301,280],{"class":236},[112,10303,10304,10307,10310,10312],{"class":114,"line":126},[112,10305,10306],{"class":517},"  id",[112,10308,10309],{"class":229},"?:",[112,10311,523],{"class":129},[112,10313,237],{"class":236},[112,10315,10316,10319,10321,10323,10325,10328,10331,10333,10335],{"class":114,"line":135},[112,10317,10318],{"class":517},"  created_at",[112,10320,10309],{"class":229},[112,10322,1419],{"class":236},[112,10324,2445],{"class":129},[112,10326,10327],{"class":229}," |",[112,10329,10330],{"class":118}," Date",[112,10332,10327],{"class":229},[112,10334,1054],{"class":129},[112,10336,464],{"class":236},[112,10338,10339,10342,10344,10346,10348,10350,10352,10354,10356],{"class":114,"line":147},[112,10340,10341],{"class":517},"  updated_at",[112,10343,10309],{"class":229},[112,10345,1419],{"class":236},[112,10347,2445],{"class":129},[112,10349,10327],{"class":229},[112,10351,10330],{"class":118},[112,10353,10327],{"class":229},[112,10355,1054],{"class":129},[112,10357,464],{"class":236},[112,10359,10360,10363,10365,10367,10370],{"class":114,"line":202},[112,10361,10362],{"class":517},"  name",[112,10364,171],{"class":229},[112,10366,523],{"class":129},[112,10368,10369],{"class":236},"; ",[112,10371,10372],{"class":578},"// Required\n",[112,10374,10375,10378,10380,10382],{"class":114,"line":208},[112,10376,10377],{"class":517},"  slug",[112,10379,10309],{"class":229},[112,10381,523],{"class":129},[112,10383,237],{"class":236},[112,10385,10386,10389,10391,10393,10395],{"class":114,"line":291},[112,10387,10388],{"class":517},"  format",[112,10390,10309],{"class":229},[112,10392,523],{"class":129},[112,10394,10369],{"class":236},[112,10396,10397],{"class":578},"// One of the supported formats\n",[112,10399,10400,10403,10405,10407],{"class":114,"line":299},[112,10401,10402],{"class":517},"  original_format",[112,10404,10309],{"class":229},[112,10406,523],{"class":129},[112,10408,237],{"class":236},[112,10410,10411,10414,10416,10418],{"class":114,"line":307},[112,10412,10413],{"class":517},"  options",[112,10415,10309],{"class":229},[112,10417,523],{"class":129},[112,10419,10420],{"class":236},"[];\n",[112,10422,10423,10426,10428,10430,10432],{"class":114,"line":315},[112,10424,10425],{"class":517},"  object_type",[112,10427,171],{"class":229},[112,10429,523],{"class":129},[112,10431,10369],{"class":236},[112,10433,10434],{"class":578},"// e.g. 'commerce_item', 'ats_job'\n",[112,10436,10437,10440,10442,10445,10448,10450,10452,10455,10457,10459,10462],{"class":114,"line":323},[112,10438,10439],{"class":517},"  objects",[112,10441,10309],{"class":229},[112,10443,10444],{"class":236}," { [",[112,10446,10447],{"class":517},"objectType",[112,10449,171],{"class":229},[112,10451,523],{"class":129},[112,10453,10454],{"class":236},"]",[112,10456,171],{"class":229},[112,10458,523],{"class":129},[112,10460,10461],{"class":236},"[] }; ",[112,10463,10464],{"class":578},"// Map of object_type to object IDs\n",[112,10466,10467],{"class":114,"line":329},[112,10468,584],{"class":236},[16,10470],{},[67,10472,10473],{"id":4581},"Key Concepts",[35,10475,10477],{"id":10476},"object_type",[109,10478,10476],{},[19,10480,4603,10481,10484],{},[478,10482,10483],{},"unified model"," the metadata is associated with. Examples include:",[72,10486,10487,10492,10497,10502],{},[46,10488,10489],{},[109,10490,10491],{},"\"commerce_item\"",[46,10493,10494],{},[109,10495,10496],{},"\"ats_job\"",[46,10498,10499],{},[109,10500,10501],{},"\"hris_employee\"",[46,10503,10504],{},"Other Unified Objects",[10506,10507,10508],"blockquote",{},[19,10509,10510,10511,10513],{},"When listing metadata_metadata entries, you can filter by ",[478,10512,2472],{},", which corresponds to the object_type.",[16,10515],{},[35,10517,10519],{"id":10518},"format",[109,10520,10518],{},[19,10522,10523],{},"Defines the data type for the metadata field. Supported formats include:",[72,10525,10526,10531,10536,10541,10546,10551,10556,10561,10566,10571,10576,10581,10586],{},[46,10527,10528],{},[109,10529,10530],{},"'TEXT'",[46,10532,10533],{},[109,10534,10535],{},"'NUMBER'",[46,10537,10538],{},[109,10539,10540],{},"'DATE'",[46,10542,10543],{},[109,10544,10545],{},"'BOOLEAN'",[46,10547,10548],{},[109,10549,10550],{},"'FILE'",[46,10552,10553],{},[109,10554,10555],{},"'TEXTAREA'",[46,10557,10558],{},[109,10559,10560],{},"'SINGLE_SELECT'",[46,10562,10563],{},[109,10564,10565],{},"'MULTIPLE_SELECT'",[46,10567,10568],{},[109,10569,10570],{},"'MEASUREMENT'",[46,10572,10573],{},[109,10574,10575],{},"'PRICE'",[46,10577,10578],{},[109,10579,10580],{},"'YES_NO'",[46,10582,10583],{},[109,10584,10585],{},"'CURRENCY'",[46,10587,10588],{},[109,10589,10590],{},"'URL'",[16,10592],{},[35,10594,10596],{"id":10595},"objects",[109,10597,10595],{},[19,10599,10600,10601],{},"A mapping of object types to the specific object IDs where this metadata is currently applied.\n",[478,10602,10603],{},"Example:",[102,10605,10607],{"className":2318,"code":10606,"language":2320,"meta":107,"style":107},"{\n  \"objects\": {\n    \"commerce_item\": [\"item1\", \"item2\"],\n    \"ats_job\": [\"job1\"]\n  }\n}\n",[109,10608,10609,10613,10620,10637,10649,10653],{"__ignoreMap":107},[112,10610,10611],{"class":114,"line":115},[112,10612,2327],{"class":236},[112,10614,10615,10618],{"class":114,"line":126},[112,10616,10617],{"class":129},"  \"objects\"",[112,10619,3888],{"class":236},[112,10621,10622,10625,10627,10630,10632,10635],{"class":114,"line":135},[112,10623,10624],{"class":129},"    \"commerce_item\"",[112,10626,3903],{"class":236},[112,10628,10629],{"class":122},"\"item1\"",[112,10631,1046],{"class":236},[112,10633,10634],{"class":122},"\"item2\"",[112,10636,3908],{"class":236},[112,10638,10639,10642,10644,10647],{"class":114,"line":147},[112,10640,10641],{"class":129},"    \"ats_job\"",[112,10643,3903],{"class":236},[112,10645,10646],{"class":122},"\"job1\"",[112,10648,2794],{"class":236},[112,10650,10651],{"class":114,"line":202},[112,10652,1476],{"class":236},[112,10654,10655],{"class":114,"line":208},[112,10656,584],{"class":236},[19,10658,10659],{},"This makes it easy to track which unified records are using each metadata definition.",[16,10661],{},[67,10663,10665],{"id":10664},"usage-in-unified-objects","Usage in Unified Objects",[19,10667,10668,10669,10671,10672,10674],{},"Each unified object includes a ",[109,10670,4631],{}," array, where each entry corresponds to a metadata definition from the ",[109,10673,4708],{}," registry.",[35,10676,10678,10679],{"id":10677},"example-iatsjob","Example: ",[109,10680,10681],{},"IAtsJob",[102,10683,10685],{"className":9951,"code":10684,"language":9953,"meta":107,"style":107},"interface IAtsMetadata {\n  id?: string;\n  slug?: string;\n  value?: unknown;\n  namespace?: string;\n  format?: string;\n  extra_data?: unknown;\n}\n\ninterface IAtsJob {\n  ...\n  metadata?: IAtsMetadata[];\n  ...\n}\n",[109,10686,10687,10696,10706,10716,10728,10739,10749,10760,10764,10768,10777,10782,10793,10797],{"__ignoreMap":107},[112,10688,10689,10691,10694],{"class":114,"line":115},[112,10690,10296],{"class":229},[112,10692,10693],{"class":118}," IAtsMetadata",[112,10695,280],{"class":236},[112,10697,10698,10700,10702,10704],{"class":114,"line":126},[112,10699,10306],{"class":517},[112,10701,10309],{"class":229},[112,10703,523],{"class":129},[112,10705,237],{"class":236},[112,10707,10708,10710,10712,10714],{"class":114,"line":135},[112,10709,10377],{"class":517},[112,10711,10309],{"class":229},[112,10713,523],{"class":129},[112,10715,237],{"class":236},[112,10717,10718,10721,10723,10726],{"class":114,"line":147},[112,10719,10720],{"class":517},"  value",[112,10722,10309],{"class":229},[112,10724,10725],{"class":129}," unknown",[112,10727,237],{"class":236},[112,10729,10730,10733,10735,10737],{"class":114,"line":202},[112,10731,10732],{"class":517},"  namespace",[112,10734,10309],{"class":229},[112,10736,523],{"class":129},[112,10738,237],{"class":236},[112,10740,10741,10743,10745,10747],{"class":114,"line":208},[112,10742,10388],{"class":517},[112,10744,10309],{"class":229},[112,10746,523],{"class":129},[112,10748,237],{"class":236},[112,10750,10751,10754,10756,10758],{"class":114,"line":291},[112,10752,10753],{"class":517},"  extra_data",[112,10755,10309],{"class":229},[112,10757,10725],{"class":129},[112,10759,237],{"class":236},[112,10761,10762],{"class":114,"line":299},[112,10763,584],{"class":236},[112,10765,10766],{"class":114,"line":307},[112,10767,272],{"emptyLinePlaceholder":271},[112,10769,10770,10772,10775],{"class":114,"line":315},[112,10771,10296],{"class":229},[112,10773,10774],{"class":118}," IAtsJob",[112,10776,280],{"class":236},[112,10778,10779],{"class":114,"line":323},[112,10780,10781],{"class":229},"  ...\n",[112,10783,10784,10787,10789,10791],{"class":114,"line":329},[112,10785,10786],{"class":517},"  metadata",[112,10788,10309],{"class":229},[112,10790,10693],{"class":118},[112,10792,10420],{"class":236},[112,10794,10795],{"class":114,"line":341},[112,10796,10781],{"class":229},[112,10798,10799],{"class":114,"line":346},[112,10800,584],{"class":236},[16,10802],{},[67,10804,10806],{"id":10805},"workflow-example","Workflow Example",[35,10808,10810,10811,10813],{"id":10809},"step-1-create-a-metadata_metadata-definition","Step 1: Create a ",[109,10812,4708],{}," Definition",[19,10815,10816,10817,10820],{},"To begin, define the metadata schema by providing ",[478,10818,10819],{},"only"," the following required fields:",[72,10822,10823,10828,10834],{},[46,10824,10825,10827],{},[109,10826,637],{},": Human-friendly label",[46,10829,10830,10833],{},[109,10831,10832],{},"slug",": Unique programmatic identifier (Picked up from name if not given)",[46,10835,10836,10838,10839,1046,10841,10844],{},[109,10837,10518],{},": Expected data format (e.g., ",[109,10840,4774],{},[109,10842,10843],{},"\"NUMBER\"",", etc.)",[102,10846,10848],{"className":2318,"code":10847,"language":2320,"meta":107,"style":107},"POST /metadata_metadata\n{\n  \"name\": \"Binding Mount\",\n  \"slug\": \"binding_mount\",\n  \"format\": \"TEXT\"\n}\n",[109,10849,10850,10855,10859,10870,10881,10891],{"__ignoreMap":107},[112,10851,10852],{"class":114,"line":115},[112,10853,10854],{"class":236},"POST /metadata_metadata\n",[112,10856,10857],{"class":114,"line":126},[112,10858,2327],{"class":236},[112,10860,10861,10863,10865,10868],{"class":114,"line":135},[112,10862,2357],{"class":129},[112,10864,2335],{"class":236},[112,10866,10867],{"class":122},"\"Binding Mount\"",[112,10869,288],{"class":236},[112,10871,10872,10874,10876,10879],{"class":114,"line":147},[112,10873,8932],{"class":129},[112,10875,2335],{"class":236},[112,10877,10878],{"class":122},"\"binding_mount\"",[112,10880,288],{"class":236},[112,10882,10883,10886,10888],{"class":114,"line":202},[112,10884,10885],{"class":129},"  \"format\"",[112,10887,2335],{"class":236},[112,10889,10890],{"class":122},"\"TEXT\"\n",[112,10892,10893],{"class":114,"line":208},[112,10894,584],{"class":236},[16,10896],{},[35,10898,10900],{"id":10899},"step-2-review-the-created-metadata","Step 2: Review the Created Metadata",[19,10902,10903],{},"Once the metadata is created, the full record might look like this (after automatic enrichment):",[102,10905,10907],{"className":2318,"code":10906,"language":2320,"meta":107,"style":107},"GET /metadata_metadata/1\n{\n  \"id\": \"1\",\n  \"name\": \"Binding Mount\",\n  \"slug\": \"binding_mount\",\n  \"format\": \"TEXT\",\n  \"original_format\": \"single_line_text_field\"\n}\n",[109,10908,10909,10917,10921,10933,10943,10953,10963,10973],{"__ignoreMap":107},[112,10910,10911,10914],{"class":114,"line":115},[112,10912,10913],{"class":236},"GET /metadata_metadata/",[112,10915,10916],{"class":129},"1\n",[112,10918,10919],{"class":114,"line":126},[112,10920,2327],{"class":236},[112,10922,10923,10926,10928,10931],{"class":114,"line":135},[112,10924,10925],{"class":129},"  \"id\"",[112,10927,2335],{"class":236},[112,10929,10930],{"class":122},"\"1\"",[112,10932,288],{"class":236},[112,10934,10935,10937,10939,10941],{"class":114,"line":147},[112,10936,2357],{"class":129},[112,10938,2335],{"class":236},[112,10940,10867],{"class":122},[112,10942,288],{"class":236},[112,10944,10945,10947,10949,10951],{"class":114,"line":202},[112,10946,8932],{"class":129},[112,10948,2335],{"class":236},[112,10950,10878],{"class":122},[112,10952,288],{"class":236},[112,10954,10955,10957,10959,10961],{"class":114,"line":208},[112,10956,10885],{"class":129},[112,10958,2335],{"class":236},[112,10960,4774],{"class":122},[112,10962,288],{"class":236},[112,10964,10965,10968,10970],{"class":114,"line":291},[112,10966,10967],{"class":129},"  \"original_format\"",[112,10969,2335],{"class":236},[112,10971,10972],{"class":122},"\"single_line_text_field\"\n",[112,10974,10975],{"class":114,"line":299},[112,10976,584],{"class":236},[16,10978],{},[35,10980,10982],{"id":10981},"step-3-attach-metadata-to-a-unified-object","Step 3: Attach Metadata to a Unified Object",[102,10984,10986],{"className":2318,"code":10985,"language":2320,"meta":107,"style":107},"PATCH /commerce_item/7\n{\n  \"metadata\": [\n    {\n      \"id\": \"1\",\n      \"slug\": \"binding_mount\",\n      \"value\": \"Optimistic\"\n    }\n  ]\n}\n",[109,10987,10988,10996,11000,11006,11010,11021,11032,11042,11046,11050],{"__ignoreMap":107},[112,10989,10990,10993],{"class":114,"line":115},[112,10991,10992],{"class":236},"PATCH /commerce_item/",[112,10994,10995],{"class":129},"7\n",[112,10997,10998],{"class":114,"line":126},[112,10999,2327],{"class":236},[112,11001,11002,11004],{"class":114,"line":135},[112,11003,9093],{"class":129},[112,11005,2372],{"class":236},[112,11007,11008],{"class":114,"line":147},[112,11009,1076],{"class":236},[112,11011,11012,11015,11017,11019],{"class":114,"line":202},[112,11013,11014],{"class":129},"      \"id\"",[112,11016,2335],{"class":236},[112,11018,10930],{"class":122},[112,11020,288],{"class":236},[112,11022,11023,11026,11028,11030],{"class":114,"line":208},[112,11024,11025],{"class":129},"      \"slug\"",[112,11027,2335],{"class":236},[112,11029,10878],{"class":122},[112,11031,288],{"class":236},[112,11033,11034,11037,11039],{"class":114,"line":291},[112,11035,11036],{"class":129},"      \"value\"",[112,11038,2335],{"class":236},[112,11040,11041],{"class":122},"\"Optimistic\"\n",[112,11043,11044],{"class":114,"line":299},[112,11045,3946],{"class":236},[112,11047,11048],{"class":114,"line":307},[112,11049,2403],{"class":236},[112,11051,11052],{"class":114,"line":315},[112,11053,584],{"class":236},[19,11055,11056],{},"Make sure the id /  slug match the schema created in Step 1.",[35,11058,11060],{"id":11059},"step-4-review-the-metadata-again","Step 4: Review the Metadata Again",[19,11062,11063],{},"Once the metadata is used in a Unified object, the full record might be updated to look like this:",[102,11065,11067],{"className":2318,"code":11066,"language":2320,"meta":107,"style":107},"GET /metadata_metadata/1\n{\n  \"id\": \"1\",\n  \"name\": \"Binding Mount\",\n  \"slug\": \"binding_mount\",\n  \"format\": \"TEXT\",\n  \"original_format\": \"single_line_text_field\",\n  \"object_type\": \"commerce_item\",\n  \"objects\": {\n    \"commerce_item\": [\"7\"]\n  }\n}\n",[109,11068,11069,11075,11079,11089,11099,11109,11119,11130,11141,11147,11158,11162],{"__ignoreMap":107},[112,11070,11071,11073],{"class":114,"line":115},[112,11072,10913],{"class":236},[112,11074,10916],{"class":129},[112,11076,11077],{"class":114,"line":126},[112,11078,2327],{"class":236},[112,11080,11081,11083,11085,11087],{"class":114,"line":135},[112,11082,10925],{"class":129},[112,11084,2335],{"class":236},[112,11086,10930],{"class":122},[112,11088,288],{"class":236},[112,11090,11091,11093,11095,11097],{"class":114,"line":147},[112,11092,2357],{"class":129},[112,11094,2335],{"class":236},[112,11096,10867],{"class":122},[112,11098,288],{"class":236},[112,11100,11101,11103,11105,11107],{"class":114,"line":202},[112,11102,8932],{"class":129},[112,11104,2335],{"class":236},[112,11106,10878],{"class":122},[112,11108,288],{"class":236},[112,11110,11111,11113,11115,11117],{"class":114,"line":208},[112,11112,10885],{"class":129},[112,11114,2335],{"class":236},[112,11116,4774],{"class":122},[112,11118,288],{"class":236},[112,11120,11121,11123,11125,11128],{"class":114,"line":291},[112,11122,10967],{"class":129},[112,11124,2335],{"class":236},[112,11126,11127],{"class":122},"\"single_line_text_field\"",[112,11129,288],{"class":236},[112,11131,11132,11135,11137,11139],{"class":114,"line":299},[112,11133,11134],{"class":129},"  \"object_type\"",[112,11136,2335],{"class":236},[112,11138,10491],{"class":122},[112,11140,288],{"class":236},[112,11142,11143,11145],{"class":114,"line":307},[112,11144,10617],{"class":129},[112,11146,3888],{"class":236},[112,11148,11149,11151,11153,11156],{"class":114,"line":315},[112,11150,10624],{"class":129},[112,11152,3903],{"class":236},[112,11154,11155],{"class":122},"\"7\"",[112,11157,2794],{"class":236},[112,11159,11160],{"class":114,"line":323},[112,11161,1476],{"class":236},[112,11163,11164],{"class":114,"line":329},[112,11165,584],{"class":236},[19,11167,11168,11169,11171,11172,634],{},"This shows the metadata definition has been associated with the unified object type ",[109,11170,4571],{}," and is linked to object with ID ",[109,11173,11174],{},"7",[16,11176],{},[67,11178,11180],{"id":11179},"crudl-support","CRUDL Support",[19,11182,11183,11184,11187,11188,11190],{},"Full ",[478,11185,11186],{},"Create, Read, Update, Delete, and List"," operations are supported on ",[109,11189,4708],{},". This enables:",[72,11192,11193,11196,11199],{},[46,11194,11195],{},"Schema-driven form builders",[46,11197,11198],{},"Reusable definitions across multiple objects",[46,11200,11201],{},"Consistent data validation and audit trails",[16,11203],{},[67,11205,11207],{"id":11206},"use-cases","Use Cases",[1868,11209,11210,11220],{},[1871,11211,11212],{},[1874,11213,11214,11217],{},[1877,11215,11216],{},"Use Case",[1877,11218,11219],{},"Example",[1890,11221,11222,11232,11242],{},[1874,11223,11224,11227],{},[1895,11225,11226],{},"Custom field on ATS Job",[1895,11228,11229],{},[109,11230,11231],{},"\"interview_style\": \"technical panel\"",[1874,11233,11234,11237],{},[1895,11235,11236],{},"Enrich commerce item with specs",[1895,11238,11239],{},[109,11240,11241],{},"\"binding_mount\": \"Optimistic\"",[1874,11243,11244,11247],{},[1895,11245,11246],{},"Add legal identifiers to employee",[1895,11248,11249],{},[109,11250,11251],{},"\"national_id\": \"IN123456\"",[1558,11253,11254],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":107,"searchDepth":126,"depth":126,"links":11256},[11257,11258,11259,11260,11265,11269,11276,11277],{"id":9689,"depth":126,"text":9690},{"id":10268,"depth":126,"text":2046},{"id":10285,"depth":126,"text":10286},{"id":4581,"depth":126,"text":10473,"children":11261},[11262,11263,11264],{"id":10476,"depth":135,"text":10476},{"id":10518,"depth":135,"text":10518},{"id":10595,"depth":135,"text":10595},{"id":10664,"depth":126,"text":10665,"children":11266},[11267],{"id":10677,"depth":135,"text":11268},"Example: IAtsJob",{"id":10805,"depth":126,"text":10806,"children":11270},[11271,11273,11274,11275],{"id":10809,"depth":135,"text":11272},"Step 1: Create a metadata_metadata Definition",{"id":10899,"depth":135,"text":10900},{"id":10981,"depth":135,"text":10982},{"id":11059,"depth":135,"text":11060},{"id":11179,"depth":126,"text":11180},{"id":11206,"depth":126,"text":11207},"The metadatametadata object is a powerful addition to the Unified data model. It enables the definition of metadata schemas (custom fields) that can be...",{"img":11280,"date":11281,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/enriching_unified_objects_with_custom_metadata-icon.webp","2025-07-23T00:00:00.000Z","/guides/enriching_unified_objects_with_custom_metadata",{"title":10230,"description":11278},"guides/enriching_unified_objects_with_custom_metadata","IcmzJQ6aKxI9zqyCtVKrOPqctOYciHGaNb0Po5aD_bc",{"id":11287,"title":11288,"body":11289,"description":11531,"extension":1576,"meta":11532,"navigation":271,"path":11535,"seo":11536,"stem":11537,"__hash__":11538},"guides/guides/extended_observability_pushing_api_logs_to_grafana_loki.md","Extended observability — pushing API logs to Grafana / Loki",{"type":9,"value":11290,"toc":11526},[11291,11294,11296,11301,11329,11346,11349,11489,11497,11500,11509,11513,11516,11519],[12,11292,11288],{"id":11293},"extended-observability-pushing-api-logs-to-grafana-loki",[16,11295],{},[19,11297,11298],{},[22,11299,11300],{},"April 27, 2023",[19,11302,11303,11304,11307,11308,11311,11312,11315,11316,11318,11319,11324,11325,634],{},"We're excited to add another option for external observability: you can send ",[478,11305,11306],{},"API call logs"," from ",[1614,11309,1640],{"href":1638,"rel":11310},[1618]," directly to a ",[478,11313,11314],{},"Grafana Loki","–compatible endpoint. directly to a ",[478,11317,11314],{},"–compatible endpoint. This is the same class of logs we already support for ",[1614,11320,11323],{"href":11321,"rel":11322},"https://docs.unified.to/guides/extended_observability_pushing_api_logs_to_your_datadog_instance",[1618],"Datadog","; you choose where they go in your ",[1614,11326,11328],{"href":10109,"rel":11327},[1618],"workspace settings",[19,11330,11331,11338,11339,11345],{},[1614,11332,11335],{"href":11333,"rel":11334},"https://grafana.com/products/cloud/",[1618],[478,11336,11337],{},"Grafana Cloud"," and ",[1614,11340,11343],{"href":11341,"rel":11342},"https://grafana.com/oss/loki/",[1618],[478,11344,11314],{}," are commonly used for log aggregation and querying. Unified delivers logs using Loki's standard HTTP push API.",[19,11347,11348],{},"Setting it up is easy! Here's how:",[72,11350,11351,11399,11459],{},[46,11352,11353,11356],{},[478,11354,11355],{},"Prepare your endpoint and credentials",[72,11357,11358,11380],{},[46,11359,11360,11361,11367,11368,11371,11372,11375,11376,11379],{},"In ",[1614,11362,11365],{"href":11363,"rel":11364},"https://grafana.com/docs/grafana-cloud/",[1618],[478,11366,11337],{},", open your stack and note the ",[478,11369,11370],{},"logs / Loki"," ingest base URL (no path) — often ",[109,11373,11374],{},"https://logs-prod-XX.grafana.net"," (your region may differ). If you use ",[478,11377,11378],{},"self-hosted Loki",", use that base URL instead.",[46,11381,11382,11383,11386,11387,2251,11390,2251,11395,11398],{},"Create or copy a ",[478,11384,11385],{},"logs token"," (or the username + token pair your provider documents for Basic auth). ",[478,11388,11389],{},"Set",[478,11391,11392],{},[109,11393,11394],{},"grafana_site",[478,11396,11397],{},"explicitly"," for EU/regional Grafana Cloud stacks or self-hosted Loki; if you leave it blank, our API falls back to a default US Grafana Cloud logs host, which may not match your region.",[46,11400,11401,11404],{},[478,11402,11403],{},"Enter values in workspace settings",[72,11405,11406],{},[46,11407,11408,11409,11413,11414,11417,11418],{},"Open ",[1614,11410,11412],{"href":10109,"rel":11411},[1618],"Workspace settings"," (or use the Workspace API) and choose ",[478,11415,11416],{},"Grafana"," under external logging. Configure:\n",[72,11419,11420,11432,11446],{},[46,11421,11422,1419,11425,11427,11428,610],{},[478,11423,11424],{},"Loki base URL",[109,11426,11394],{},"): Base URL only (for example ",[1614,11429,11374],{"href":11430,"rel":11431},"https://logs-prod-xx.grafana.net/",[1618],[46,11433,11434,11437,11438,11441,11442,11445],{},[478,11435,11436],{},"Authentication: Basic"," (Grafana Cloud: user/instance id + token), ",[478,11439,11440],{},"Bearer"," (if your gateway expects a bearer token), or ",[478,11443,11444],{},"Legacy"," (single field — see below).",[46,11447,11448,1419,11451,11454,11455,11458],{},[478,11449,11450],{},"Token / API key",[109,11452,11453],{},"grafana_apikey","): Your secret or legacy ",[109,11456,11457],{},"user:token"," string, depending on mode.",[46,11460,11461,11464],{},[478,11462,11463],{},"Confirm logs are flowing",[72,11465,11466],{},[46,11467,11468,11469,11472,11473,11476,11477,1046,11482,1046,11485,11488],{},"Make a sample call to the Unified API (for example, list an object on a connection). In ",[478,11470,11471],{},"Grafana Explore"," (or any Loki client), run LogQL such as ",[109,11474,11475],{},"{job=\"unified-api\"}",". Log lines include JSON with the route ",[478,11478,11479],{},[109,11480,11481],{},"path",[109,11483,11484],{},"integration_type",[109,11486,11487],{},"status",", and other API-call fields.",[67,11490,11492,11493,11496],{"id":11491},"why-does-grafana-loki-matter-for-unifiedto-users","Why does Grafana / Loki matter for ",[1614,11494,1640],{"href":1638,"rel":11495},[1618]," users?",[19,11498,11499],{},"By sending your logs directly to your own Loki stack or Grafana Cloud, you get immediate visibility into what's happening in your environment. This allows you to quickly debug issues, get notified about errors, and more.\nCurrently, we support both inbound API calls and webhook calls.",[19,11501,11502,11503,11508],{},"However, we're constantly improving our product, and we're looking forward to supporting more log types in the future. So, please ",[1614,11504,11507],{"href":11505,"rel":11506},"https://unified.to/contact",[1618],"send us feedback"," so we can better understand what you need.",[67,11510,11512],{"id":11511},"about-unifiedto","About Unified.to",[19,11514,11515],{},"If you're not familiar with Unified API, it's a single API that you can use to read and write data to third-party integrations using our unified data model. This makes it easy to integrate with multiple systems and eliminates the need for separate API calls for each integration.",[19,11517,11518],{},"We hope this new feature makes your life easier and your work more efficient!",[19,11520,11521],{},[1614,11522,11525],{"href":11523,"rel":11524},"https://app.unified.to/",[1618],"Get started with Unified.to",{"title":107,"searchDepth":126,"depth":126,"links":11527},[11528,11530],{"id":11491,"depth":126,"text":11529},"Why does Grafana / Loki matter for Unified.to users?",{"id":11511,"depth":126,"text":11512},"We're excited to add another option for external observability, you can send API call logs from Unified.to directly to a Grafana Loki–compatible endpoint....",{"img":11533,"date":11534,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/extended_observability_pushing_api_logs_to_grafana_loki-icon.png","2023-04-27T00:00:00.000Z","/guides/extended_observability_pushing_api_logs_to_grafana_loki",{"title":11288,"description":11531},"guides/extended_observability_pushing_api_logs_to_grafana_loki","cUsep3S96fC0faZs2LguTTJiYyCUnskVus5lG1Hl4yg",{"id":11540,"title":11541,"body":11542,"description":11622,"extension":1576,"meta":11623,"navigation":271,"path":11625,"seo":11626,"stem":11627,"__hash__":11628},"guides/guides/extended_observability_pushing_api_logs_to_your_datadog_instance.md","Extended Observability - Pushing API Logs to your Datadog Instance",{"type":9,"value":11543,"toc":11618},[11544,11547,11549,11553,11560,11567,11569,11589,11595,11599,11602,11607,11609,11611,11613],[12,11545,11541],{"id":11546},"extended-observability-pushing-api-logs-to-your-datadog-instance",[16,11548],{},[19,11550,11551],{},[22,11552,11300],{},[19,11554,11555,11556,11559],{},"We're excited to announce the latest addition to increase observability for our customers — the ability to send API call logs within ",[1614,11557,1640],{"href":1638,"rel":11558},[1618]," directly to your Datadog instance.",[19,11561,11562,11566],{},[1614,11563,11323],{"href":11564,"rel":11565},"https://www.datadoghq.com/",[1618]," is a cloud-based monitoring and analytics platform that provides real-time insights into the performance of IT infrastructure, applications, and logs.",[19,11568,11348],{},[43,11570,11571,11580,11586],{},[46,11572,11573,11574,11579],{},"Get your Datadog API key: To start sending logs to Datadog, you need to obtain your API key. Here's a ",[1614,11575,11578],{"href":11576,"rel":11577},"https://docs.datadoghq.com/account_management/api-app-keys/",[1618],"detailed article"," that walks you through the process.",[46,11581,11582,11583,634],{},"Once you have your API key, simply paste it into your Unified.to ",[1614,11584,11328],{"href":10109,"rel":11585},[1618],[46,11587,11588],{},"Finally, make a sample API call to Unified API to confirm that logs are being sent to your Datadog instance.",[19,11590,11591],{},[1603,11592],{"alt":11593,"src":11594},"Untitled.png","https://s3.us-east-2.amazonaws.com/unified-article-images/extended_observability_pushing_api_logs_to_your_datadog_instance-0.png",[67,11596,11598],{"id":11597},"why-does-datadog-matter-for-unifiedto-users","Why does Datadog matter for Unified.to users?",[19,11600,11601],{},"By sending your logs directly to Datadog, you get immediate visibility into what's happening in your environment. This allows you to quickly debug issues, get notified about errors, and more.\nCurrently, we support both inbound API calls and webhook calls.",[19,11603,11502,11604,11508],{},[1614,11605,11507],{"href":11505,"rel":11606},[1618],[67,11608,11512],{"id":11511},[19,11610,11515],{},[19,11612,11518],{},[19,11614,11615],{},[1614,11616,11525],{"href":11523,"rel":11617},[1618],{"title":107,"searchDepth":126,"depth":126,"links":11619},[11620,11621],{"id":11597,"depth":126,"text":11598},{"id":11511,"depth":126,"text":11512},"We're excited to announce the latest addition to increase observability for our customers — the ability to send API call logs within Unified.to directly to...",{"img":11624,"date":11534,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/extended_observability_pushing_api_logs_to_your_datadog_instance-icon.png","/guides/extended_observability_pushing_api_logs_to_your_datadog_instance",{"title":11541,"description":11622},"guides/extended_observability_pushing_api_logs_to_your_datadog_instance","OrfaXkz5kaNzqF-ow7r_qhOA72rCTApl9D-jM-UjCRc",{"id":11630,"title":11631,"body":11632,"description":12172,"extension":1576,"meta":12173,"navigation":271,"path":12176,"seo":12177,"stem":12178,"__hash__":12179},"guides/guides/fireflies_integration_guide.md","Fireflies Integration Guide",{"type":9,"value":11633,"toc":12155},[11634,11637,11639,11644,11647,11663,11666,11668,11675,11682,11684,11687,11718,11725,11729,11736,11761,11764,11766,11770,11780,11791,11793,11797,11804,11809,11838,11840,11844,11874,11885,11887,11891,11898,11952,11960,11962,11966,11969,11976,12001,12004,12011,12013,12017,12028,12030,12032,12087,12090,12092,12095,12119,12121,12125,12148,12150],[12,11635,11631],{"id":11636},"fireflies-integration-guide",[16,11638],{},[19,11640,11641],{},[22,11642,11643],{},"November 5, 2025",[12,11645,11631],{"id":11646},"fireflies-integration-guide-1",[19,11648,11649,11650,11657,11658,634],{},"Learn how to connect an end-customer's ",[1614,11651,11654],{"href":11652,"rel":11653},"https://fireflies.ai/",[1618],[478,11655,11656],{},"Fireflies.ai"," account to your application using ",[1614,11659,11661],{"href":1638,"rel":11660},[1618],[478,11662,1640],{},[19,11664,11665],{},"This guide covers how to enable the integration, embed the authorization component, and verify the connection end-to-end.",[67,11667,9690],{"id":9689},[19,11669,11670,11671,11674],{},"The Fireflies integration allows your app's end users to authorize ",[1614,11672,1640],{"href":1638,"rel":11673},[1618]," to access their Fireflies accounts for meeting recordings and user data.",[19,11676,11677,11678,11681],{},"Once connected, your application can access the Fireflies API securely through ",[1614,11679,1640],{"href":1638,"rel":11680},[1618]," — without your users ever leaving your app.",[67,11683,70],{"id":69},[19,11685,11686],{},"Before getting started, ensure you have:",[72,11688,11689,11700,11712,11715],{},[46,11690,9638,11691,2251,11696,11699],{},[1614,11692,11694],{"href":1638,"rel":11693},[1618],[478,11695,1640],{},[478,11697,11698],{},"developer account"," and active API credentials",[46,11701,11702,11703,2251,11708,11711],{},"Your end-customer has a ",[1614,11704,11706],{"href":11652,"rel":11705},[1618],[478,11707,11656],{},[478,11709,11710],{},"paid plan"," (API access required)",[46,11713,11714],{},"Access to your app's frontend or backend to embed the Unified.to authorization component so that you can get your end-customer to authorize access to Fireflies",[46,11716,11717],{},"Optional: API Explorer or MCP Server for testing connections",[19,11719,11720,11721,11724],{},"Please note that the Fireflies API is only available to users on a ",[478,11722,11723],{},"paid Fireflies plan",".  Free-tier accounts cannot authorize API access.",[67,11726,11728],{"id":11727},"step-by-step-setup","Step-by-Step Setup",[35,11730,11732,11733],{"id":11731},"_1-enable-the-fireflies-integration-in-unifiedto","1. Enable the Fireflies Integration in ",[1614,11734,1640],{"href":1638,"rel":11735},[1618],[43,11737,11738,11745,11749,11756],{},[46,11739,11740,11741,11744],{},"Log in to your ",[1614,11742,1640],{"href":1638,"rel":11743},[1618]," developer dashboard.",[46,11746,9735,11747,634],{},[478,11748,9700],{},[46,11750,11751,11752,11755],{},"Locate ",[478,11753,11754],{},"Fireflies"," in the catalog.",[46,11757,9757,11758,634],{},[478,11759,11760],{},"Activate Integration",[19,11762,11763],{},"Once enabled, Fireflies becomes available for your end-customer to authorize within your own app.",[16,11765],{},[35,11767,11769],{"id":11768},"_2-embed-the-authorization-component","2. Embed the Authorization Component",[19,11771,2604,11772,11775,11776,11779],{},[478,11773,11774],{},"Embedded Authorization (Authorize Optimization)"," component from ",[1614,11777,1640],{"href":1638,"rel":11778},[1618]," to create a seamless in-app experience.",[43,11781,11782,11785,11788],{},[46,11783,11784],{},"Add the component to your application UI where users connect integrations.",[46,11786,11787],{},"Preview the embedded experience - this is what your customers see when connecting Fireflies.",[46,11789,11790],{},"The component displays a button (e.g., 'Authorize Fireflies') and short instructions.",[16,11792],{},[35,11794,11796],{"id":11795},"_3-obtain-the-fireflies-api-key","3. Obtain the Fireflies API Key",[19,11798,11799,11800,11803],{},"Your end-customers/users will need their ",[478,11801,11802],{},"Fireflies API key"," to complete authorization.",[19,11805,11806],{},[478,11807,11808],{},"Steps for your end user:",[43,11810,11811,11820,11826,11835],{},[46,11812,11813,11814,11819],{},"Log in to their ",[1614,11815,11817],{"href":11652,"rel":11816},[1618],[478,11818,11656],{}," account.",[46,11821,11822,11823,634],{},"Go to ",[478,11824,11825],{},"Settings → Integrations",[46,11827,11751,11828,11831,11832,634],{},[478,11829,11830],{},"API Key"," and click ",[478,11833,11834],{},"Copy",[46,11836,11837],{},"Return to your app's authorization screen and paste it into the field provided.",[16,11839],{},[35,11841,11843],{"id":11842},"_4-authorize-access","4. Authorize Access",[43,11845,11846,11849,11854],{},[46,11847,11848],{},"In the authorization window, paste the Fireflies API key.",[46,11850,9757,11851,634],{},[478,11852,11853],{},"Authorize",[46,11855,11856,11859,11860],{},[1614,11857,1640],{"href":1638,"rel":11858},[1618]," will automatically:\n",[72,11861,11862,11865,11868],{},[46,11863,11864],{},"Validate the API key",[46,11866,11867],{},"Connect to Fireflies",[46,11869,11870,11871],{},"Run a ",[478,11872,11873],{},"test connection",[19,11875,11876,11877,11880,11881,11884],{},"If successful, ",[1614,11878,1640],{"href":1638,"rel":11879},[1618]," creates a new ",[478,11882,11883],{},"Connection Object"," linked to that customer.",[16,11886],{},[35,11888,11890],{"id":11889},"_5-verify-the-connection","5. Verify the Connection",[19,11892,11893,11894,11897],{},"Once the test passes, a new connection record appears in your ",[1614,11895,1640],{"href":1638,"rel":11896},[1618]," dashboard.",[1868,11899,11900,11908],{},[1871,11901,11902],{},[1874,11903,11904,11906],{},[1877,11905,2425],{},[1877,11907,1882],{},[1890,11909,11910,11920,11932,11942],{},[1874,11911,11912,11917],{},[1895,11913,11914],{},[478,11915,11916],{},"Connection ID",[1895,11918,11919],{},"Unique identifier for API requests",[1874,11921,11922,11927],{},[1895,11923,11924],{},[478,11925,11926],{},"Integration",[1895,11928,11929],{},[1614,11930,11656],{"href":11652,"rel":11931},[1618],[1874,11933,11934,11939],{},[1895,11935,11936],{},[478,11937,11938],{},"Status",[1895,11940,11941],{},"Connected",[1874,11943,11944,11949],{},[1895,11945,11946],{},[478,11947,11948],{},"Created At",[1895,11950,11951],{},"Timestamp of creation",[19,11953,2604,11954,11956,11957,634],{},[478,11955,11916],{}," to make authenticated API calls to Fireflies through ",[1614,11958,1640],{"href":1638,"rel":11959},[1618],[16,11961],{},[35,11963,11965],{"id":11964},"_6-test-the-connection-optional","6. Test the Connection (Optional)",[19,11967,11968],{},"You can test the integration in two environments:",[19,11970,11971,11972,11975],{},"a) Using ",[1614,11973,1640],{"href":1638,"rel":11974},[1618]," API Explorer",[72,11977,11978,11984],{},[46,11979,11408,11980,11983],{},[478,11981,11982],{},"API Explorer"," in your dashboard.",[46,11985,11986,11987],{},"Use your new Connection ID to query endpoints such as:\n",[72,11988,11989,11995],{},[46,11990,11991,11994],{},[109,11992,11993],{},"/hris/{id}/employee"," – list Fireflies users",[46,11996,11997,12000],{},[109,11998,11999],{},"/calendar/{id}/recording"," – retrieve meeting data",[19,12002,12003],{},"b) Using MCP Server (for AI Agents)",[19,12005,12006,12007,12010],{},"If your use case involves AI agents, test the connection within your ",[478,12008,12009],{},"MCP Server"," using the same Connection ID.",[16,12012],{},[67,12014,12016],{"id":12015},"example-use-cases","Example Use Cases",[72,12018,12019,12022,12025],{},[46,12020,12021],{},"Retrieve meeting recordings for transcription or analysis",[46,12023,12024],{},"Sync Fireflies user data into your CRM or analytics system",[46,12026,12027],{},"Feed Fireflies meeting data into AI summarization or tagging workflows",[16,12029],{},[67,12031,10128],{"id":10127},[1868,12033,12034,12046],{},[1871,12035,12036],{},[1874,12037,12038,12041,12043],{},[1877,12039,12040],{},"Issue",[1877,12042,1882],{},[1877,12044,12045],{},"Solution",[1890,12047,12048,12061,12074],{},[1874,12049,12050,12055,12058],{},[1895,12051,12052],{},[478,12053,12054],{},"Authorization failed",[1895,12056,12057],{},"Invalid or expired API key",[1895,12059,12060],{},"Re-copy the key from Fireflies and retry authorization.",[1874,12062,12063,12068,12071],{},[1895,12064,12065],{},[478,12066,12067],{},"Test connection failed",[1895,12069,12070],{},"API access not enabled",[1895,12072,12073],{},"Ensure user is on a paid Fireflies plan.",[1874,12075,12076,12081,12084],{},[1895,12077,12078],{},[478,12079,12080],{},"No data returned",[1895,12082,12083],{},"Key valid but no accessible data",[1895,12085,12086],{},"Check that the Fireflies workspace contains recordings.",[19,12088,12089],{},"*Fireflies must have existing data (e.g., recorded meetings) to return results when testing API endpoints.",[16,12091],{},[67,12093,12094],{"id":10172},"Next Steps",[72,12096,12097,12110,12116],{},[46,12098,12099,12100,12105,12106,11338,12108,634],{},"Explore the ",[1614,12101,12104],{"href":12102,"rel":12103},"https://www.notion.so/api-reference",[1618],"Unified.to API Reference"," to interact with ",[109,12107,11993],{},[109,12109,11999],{},[46,12111,12112,12113,11983],{},"Monitor performance and connection status under ",[478,12114,12115],{},"Integration Health",[46,12117,12118],{},"Repeat these steps for other integrations or customer environments.",[16,12120],{},[67,12122,12124],{"id":12123},"related-articles","Related Articles",[72,12126,12127,12134,12141],{},[46,12128,12129],{},[1614,12130,12133],{"href":12131,"rel":12132},"https://www.notion.so/guides/embedded-authorization",[1618],"Embedding the Authorization Component",[46,12135,12136],{},[1614,12137,12140],{"href":12138,"rel":12139},"https://www.notion.so/guides/testing-connections",[1618],"Testing Connections via API Explorer",[46,12142,12143],{},[1614,12144,12147],{"href":12145,"rel":12146},"https://www.notion.so/guides/manage-connections",[1618],"Managing Customer Connections",[16,12149],{},[19,12151,12152],{},[22,12153,12154],{},"Last updated: November 2025",{"title":107,"searchDepth":126,"depth":126,"links":12156},[12157,12158,12159,12168,12169,12170,12171],{"id":9689,"depth":126,"text":9690},{"id":69,"depth":126,"text":70},{"id":11727,"depth":126,"text":11728,"children":12160},[12161,12163,12164,12165,12166,12167],{"id":11731,"depth":135,"text":12162},"1. Enable the Fireflies Integration in Unified.to",{"id":11768,"depth":135,"text":11769},{"id":11795,"depth":135,"text":11796},{"id":11842,"depth":135,"text":11843},{"id":11889,"depth":135,"text":11890},{"id":11964,"depth":135,"text":11965},{"id":12015,"depth":126,"text":12016},{"id":10127,"depth":126,"text":10128},{"id":10172,"depth":126,"text":12094},{"id":12123,"depth":126,"text":12124},"Learn how to connect an end-customer's Fireflies.ai account to your application using Unified.to.",{"img":12174,"date":12175,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/fireflies_integration_guide-icon.jpg","2025-11-05T00:00:00.000Z","/guides/fireflies_integration_guide",{"title":11631,"description":12172},"guides/fireflies_integration_guide","aAtOfJFf1XcniWKvJRJZ-Jp9qkSvd8cKaROJscsThb0",{"id":12181,"title":12182,"body":12183,"description":12492,"extension":1576,"meta":12493,"navigation":271,"path":12496,"seo":12497,"stem":12498,"__hash__":12499},"guides/guides/getting_started_with_workable.md","Getting started with Workable",{"type":9,"value":12184,"toc":12484},[12185,12188,12190,12195,12204,12207,12209,12223,12232,12236,12239,12254,12260,12265,12271,12277,12282,12288,12294,12318,12323,12330,12336,12347,12351,12354,12360,12364,12371,12374,12380,12383,12397,12401,12404,12407,12415,12421,12425,12428,12449,12452,12455,12463,12474],[12,12186,12182],{"id":12187},"getting-started-with-workable",[16,12189],{},[19,12191,12192],{},[22,12193,12194],{},"January 11, 2024",[19,12196,12197,12198,12203],{},"Workable is one of 190+ integrations that you no longer have to build from scratch thanks to our unified API developer platform. In this guide, you will learn about Unified.to's ",[1614,12199,12202],{"href":12200,"rel":12201},"https://unified.to/integrations/workable",[1618],"Workable integration",", including how to activate Workable, implementation steps, example use cases, and how your users can authorize the integration in your app.",[19,12205,12206],{},"At the end of this guide, you will have everything you need to activate a Workable integration and begin creating user connections in production.",[67,12208,70],{"id":69},[19,12210,12211,12212,12217,12218,634],{},"To activate a Workable integration, you will need a Unified.to account. ",[1614,12213,12216],{"href":12214,"rel":12215},"https://app.unified.to/login",[1618],"Sign up for a free tester account"," and follow the onboarding steps. Workable and all our pre-built integrations are available on every ",[1614,12219,12222],{"href":12220,"rel":12221},"https://unified.to/pricing",[1618],"Unified.to plan",[19,12224,12225,12226,12231],{},"This article assumes you are familiar with ",[1614,12227,12230],{"href":12228,"rel":12229},"https://www.workable.com/",[1618],"Workable"," and product integration concepts. You do not have to be an expert in integration development or our platform.",[67,12233,12235],{"id":12234},"activating-workable","Activating Workable",[19,12237,12238],{},"Once you've created your Unified.to account and completed onboarding, you can activate Workable and any other integrations you'd like to add to your app. Activation refers to the process of enabling and configuring an integration.",[19,12240,12241,12242,12245,12246,12249,12250,12253],{},"Sign in to Unified.to, and select ",[478,12243,12244],{},"Integrations > Active Integrations",". Use the search bar or click the ",[478,12247,12248],{},"ATS"," tab to find Workable and other integrations within the same category. You can also locate Workable in the ",[478,12251,12252],{},"HR"," tab if you are interested in HR data.",[19,12255,12256],{},[1603,12257],{"alt":12258,"src":12259},"Search_Workable_in_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-0.png",[19,12261,12262],{},[478,12263,12264],{},"Authorization",[19,12266,12267,12268,12270],{},"Select ",[478,12269,12230],{}," to begin the activation process. On the authorization page, you can specify the integration categories (ATS or HR) and the authorization method (API key or OAuth 2). If you'd like your Workable integration to support OAuth 2, you will need to enter your OAuth 2 Client ID.",[19,12272,12273],{},[1603,12274],{"alt":12275,"src":12276},"Workable_authorization.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-1.png",[19,12278,12279],{},[478,12280,12281],{},"OAuth 2",[19,12283,12284,12285,12287],{},"If you want your Workable integration to support OAuth 2, select the ",[478,12286,12281],{}," tab to view where to set your OAuth2 redirectUri to and the unified scopes to enable in your application. You may need all or some depending on your use case.",[19,12289,12290],{},[1603,12291],{"alt":12292,"src":12293},"Workable_OAuth_2_Credentials.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-2.png",[19,12295,12296,12297,12302,12303,12305,12306,12308,12309,12313,12314,634],{},"If you don't yet have your Workable OAUth 2 credentials, fill out ",[1614,12298,12301],{"href":12299,"rel":12300},"https://www.workable.com/partnership-program/apply?utm_source=unified.to&utm_medium=unified.to%20blog&utm_campaign=unifedto_partner",[1618],"this form"," to start a Workable partnership and generate your credentials. Return to the ",[478,12304,12264],{}," tab, paste your credentials, and select ",[478,12307,9760],{},". If you need support with your Workable partnership, please email ",[1614,12310,12312],{"href":12311},"mailto:hello@unified.to","hello@unified.to"," or reach out on ",[1614,12315,12317],{"href":1768,"rel":12316},[1618],"Discord",[19,12319,12320],{},[478,12321,12322],{},"Feature support",[19,12324,12325,12326,12329],{},"Select the ",[478,12327,12328],{},"Feature Support"," tab to view a detailed breakdown of the objects and fields our Workable integration currently supports. Green represents fields we support, grey represents fields Workable does not support, and the fields in red are the features we don't support yet.",[19,12331,12332],{},[1603,12333],{"alt":12334,"src":12335},"Workable_feature_support_preview.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-3.png",[19,12337,12338,12339,12342,12343,634],{},"We're always open to feedback. If you have questions or ideas, reach out on ",[1614,12340,12317],{"href":1768,"rel":12341},[1618],". To see full feature support for Workable, ",[1614,12344,12346],{"href":12214,"rel":12345},[1618],"sign in or sign up for Unified.to for free",[67,12348,12350],{"id":12349},"your-workspace","Your workspace",[19,12352,12353],{},"When you create a Unified.to account, we automatically create a workspace for you. This will be true for any team members in your company that individually sign up for Unified.to. You can create multiple workspaces for different environments (QA, staging, production, etc.) with unique access and configuration rules.",[19,12355,12356,12357,634],{},"You will need to know your workspace ID when using our embedded authorization widget. You can find your workspace ID under ",[478,12358,12359],{},"Settings > API Information",[67,12361,12363],{"id":12362},"setting-up-authorization","Setting up authorization",[19,12365,12366,12367,12370],{},"To add Workable and other integrations to your app, navigate to ",[478,12368,12369],{},"Settings > Embed"," to set up user authorization. Configure your authorization settings and copy the line of code to insert the embedded authorization widget into your app along with your workspace ID.",[19,12372,12373],{},"If you do not wish to use our authorization widget, you can call our API directly to get a list of integrations to display in your app and build your own front-end.",[19,12375,12376],{},[1603,12377],{"alt":12378,"src":12379},"Embedded_authorization.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-4.png",[19,12381,12382],{},"You can also interact with the authorization preview to simulate your end user's Workable authorization experience. You'll see the same authorization page that your end user will experience when they enable an integration in your app.",[19,12384,12385,12386,12391,12392,634],{},"You can run further authorization tests by adding a ",[1614,12387,12390],{"href":12388,"rel":12389},"https://unified.to/blog/start_here_how_to_add_a_test_connection",[1618],"test user connection"," or by using our ",[1614,12393,12396],{"href":12394,"rel":12395},"https://unified.to/blog/how_to_test_unified_apis_using_sandbox_connections",[1618],"sandbox environment",[67,12398,12400],{"id":12399},"creating-user-connections","Creating user connections",[19,12402,12403],{},"Once a customer authorizes a Workable integration from your app, they are redirected to the success URL that you defined earlier when setting up authorization.",[19,12405,12406],{},"That URL will have an id={connection_id} appended to the URL. Store that connection_id in your database and associate it with your customer's account. You can also send in a state query parameter with your customer's ID.",[12408,12409],"iframe",{"width":12410,"height":12411,"src":12412,"title":12413,"frameBorder":660,"allow":12414,"allowFullScreen":271},560,315,"https://www.youtube.com/embed/sd9Efb4i9N0?si=f-ztv2g3nFdRiq_S","YouTube video player","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",[19,12416,12417,12420],{},[478,12418,12419],{},"Important:"," Make sure you associate your app's user ID/account ID with the newly created Unified.to connection ID. We recommend using the state parameter in our embedded authorization widget or authorization endpoint. That state will be sent back to your success_url along with the connection_id. Store our connection_id in your database and associate it with your user.",[67,12422,12424],{"id":12423},"perform-actions-with-your-user-connections","Perform actions with your user connections",[19,12426,12427],{},"Here's the exciting part! Once your user authorizes your Workable integration, you can start accessing our API with your user connections. User connections represent a specific authentication of an integration, which means you can now:",[72,12429,12430,12433,12436],{},[46,12431,12432],{},"Access your customers' third-party data in Workable",[46,12434,12435],{},"Build new features and support more users",[46,12437,12438,12439,11338,12444],{},"Leverage Workable data to support use cases like ",[1614,12440,12443],{"href":12441,"rel":12442},"https://unified.to/blog/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified",[1618],"candidate sourcing",[1614,12445,12448],{"href":12446,"rel":12447},"https://unified.to/blog/how_to_build_a_candidate_assessment_product_with_unified",[1618],"candidate assessments",[19,12450,12451],{},"If you'd like to simulate performing actions with user connections, you can create user connections in our Sandbox environment.",[12408,12453],{"width":12410,"height":12411,"src":12454,"title":12413,"frameBorder":660,"allow":12414,"allowFullScreen":271},"https://www.youtube.com/embed/jA6_Dot5kN0?si=jRPZqnVkIoq6YYKP",[19,12456,12457,12458,634],{},"Pass 'X-Mock: 1' in a header in your API request to receive mock data from our API. ",[1614,12459,12462],{"href":12460,"rel":12461},"https://docs.unified.to/overview/restapi/mock",[1618],"See documentation",[19,12464,12465,12468,12469,634],{},[478,12466,12467],{},"Note:"," We have SDKs available for Node/Typescript, Python, PHP, Java, Go, C#, and Ruby. ",[1614,12470,12473],{"href":12471,"rel":12472},"https://docs.unified.to/overview/sdks",[1618],"Learn more",[19,12475,12476,12477,12480,12481,634],{},"Have a question for us? Complete ",[1614,12478,12301],{"href":11505,"rel":12479},[1618]," or chat with us directly on ",[1614,12482,12317],{"href":1768,"rel":12483},[1618],{"title":107,"searchDepth":126,"depth":126,"links":12485},[12486,12487,12488,12489,12490,12491],{"id":69,"depth":126,"text":70},{"id":12234,"depth":126,"text":12235},{"id":12349,"depth":126,"text":12350},{"id":12362,"depth":126,"text":12363},{"id":12399,"depth":126,"text":12400},{"id":12423,"depth":126,"text":12424},"Workable is one of 190+ integrations that you no longer have to build from scratch thanks to our unified API developer platform. In this guide, you will learn...",{"img":12494,"date":12495,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-icon.png","2024-01-11T00:00:00.000Z","/guides/getting_started_with_workable",{"title":12182,"description":12492},"guides/getting_started_with_workable","FQlKTeg2xqyA9_FpYLUg_y-IBSg1PcbIl_EmU8Ln16U",{"id":12501,"title":12502,"body":12503,"description":12687,"extension":1576,"meta":12688,"navigation":271,"path":12691,"seo":12692,"stem":12693,"__hash__":12694},"guides/guides/handling_delegated_vs_application_scopes_in_microsoft_integrations.md","Handling Delegated vs. Application Scopes in Microsoft Integrations",{"type":9,"value":12504,"toc":12680},[12505,12508,12510,12515,12525,12528,12531,12534,12540,12546,12553,12556,12570,12576,12583,12586,12604,12607,12630,12632,12638,12641,12659,12662,12677],[12,12506,12502],{"id":12507},"handling-delegated-vs-application-scopes-in-microsoft-integrations",[16,12509],{},[19,12511,12512],{},[22,12513,12514],{},"December 9, 2025",[19,12516,12517,12518,11338,12521,12524],{},"Microsoft Graph offers two fundamentally different permission models — ",[478,12519,12520],{},"Delegated",[478,12522,12523],{},"Application"," scopes. Understanding how these scopes behave is important when connecting Microsoft integrations through Unified.",[19,12526,12527],{},"Some Microsoft APIs only support delegated permissions, while others require strictly application-level permissions. Mixing them in a single OAuth flow will cause failures.",[19,12529,12530],{},"In Unified, you can create separate Microsoft connections so you can cleanly target the scopes required for the endpoints you plan to use.",[19,12532,12533],{},"This guide explains the difference between the permission types, why certain Unified endpoints require one or the other, and how to configure your Unified connections correctly.",[67,12535,12537],{"id":12536},"_1-delegated-vs-application-permissions",[478,12538,12539],{},"1. Delegated vs. Application Permissions",[35,12541,12543],{"id":12542},"delegated-permissions",[478,12544,12545],{},"Delegated Permissions",[19,12547,12548,12549,12552],{},"Delegated permissions are used when a ",[478,12550,12551],{},"signed-in Microsoft user"," is present in the OAuth flow.",[19,12554,12555],{},"Use delegated permissions when:",[72,12557,12558,12564,12567],{},[46,12559,12560,12561],{},"The API needs to act ",[478,12562,12563],{},"on behalf of a user",[46,12565,12566],{},"You want to access data the user normally has permission to view",[46,12568,12569],{},"The Microsoft Graph endpoint explicitly supports delegated scopes",[35,12571,12573],{"id":12572},"application-permissions",[478,12574,12575],{},"Application Permissions",[19,12577,12578,12579,12582],{},"Application permissions are used when ",[478,12580,12581],{},"no user is logged in",", and the app accesses Microsoft Graph directly as itself.",[19,12584,12585],{},"Use application permissions when:",[72,12587,12588,12594,12597],{},[46,12589,12590,12591],{},"A Microsoft endpoint ",[478,12592,12593],{},"does not support delegated scopes",[46,12595,12596],{},"The API involves system-level or tenant-wide data",[46,12598,12599,12600,12603],{},"The OAuth token must come from the ",[478,12601,12602],{},"client_credentials"," flow",[19,12605,12606],{},"Examples of Unified endpoints that only support application scopes:",[72,12608,12609],{},[46,12610,12611,12616,12617],{},[478,12612,12613],{},[109,12614,12615],{},"uc_call"," (MS Teams call records API)\n",[72,12618,12619],{},[46,12620,12621,12622,12625,12626,12629],{},"Microsoft Graph requires ",[109,12623,12624],{},"CallRecords.Read.All"," as an ",[478,12627,12628],{},"application permission",", not delegated.",[16,12631],{},[67,12633,12635],{"id":12634},"_2-why-you-cannot-mix-delegated-and-application-scopes",[478,12636,12637],{},"2. Why You Cannot Mix Delegated and Application Scopes",[19,12639,12640],{},"Microsoft Graph enforces strict separation between permission types:",[72,12642,12643,12650,12656],{},[46,12644,12645,12646,12649],{},"Delegated scopes must be requested during a ",[478,12647,12648],{},"user login"," OAuth flow",[46,12651,12652,12653],{},"Application scopes must be requested using ",[478,12654,12655],{},"client credentials",[46,12657,12658],{},"A single OAuth authorization cannot request both delegated and application permissions",[19,12660,12661],{},"If both are selected together:",[72,12663,12664,12671,12674],{},[46,12665,12666,12667,12670],{},"Microsoft returns ",[109,12668,12669],{},"AADSTS650053"," or similar errors",[46,12672,12673],{},"The OAuth token cannot be issued",[46,12675,12676],{},"Your Unified connection will fail to authenticate",[19,12678,12679],{},"Because of this, selecting both scope types for the same Unified connection will not work.",{"title":107,"searchDepth":126,"depth":126,"links":12681},[12682,12686],{"id":12536,"depth":126,"text":12539,"children":12683},[12684,12685],{"id":12542,"depth":135,"text":12545},{"id":12572,"depth":135,"text":12575},{"id":12634,"depth":126,"text":12637},"Microsoft Graph offers two fundamentally different permission models — Delegated and Application scopes. Understanding how these scopes behave is important...",{"img":12689,"date":12690,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/handling_delegated_vs_application_scopes_in_microsoft_integrations-icon.png","2025-12-09T21:05:00.000Z","/guides/handling_delegated_vs_application_scopes_in_microsoft_integrations",{"title":12502,"description":12687},"guides/handling_delegated_vs_application_scopes_in_microsoft_integrations","rTjyDxknk3g0xsEyTWvWMdyGfXH2DdMpsXf43KF--f0",{"id":12696,"title":12697,"body":12698,"description":12818,"extension":1576,"meta":12819,"navigation":271,"path":12822,"seo":12823,"stem":12824,"__hash__":12825},"guides/guides/how_long_are_logs_retained.md","How long are logs retained",{"type":9,"value":12699,"toc":12816},[12700,12703,12705,12710,12716,12724,12731,12813],[12,12701,12697],{"id":12702},"how-long-are-logs-retained",[16,12704],{},[19,12706,12707],{},[22,12708,12709],{},"April 2, 2024",[19,12711,12712,12715],{},[478,12713,12714],{},"API call logs are retained for 60 days."," Our system removes log entries for API calls that are older than 60 days.",[19,12717,12718,12719,634],{},"To retain a record of all of your API calls, we suggest that you make a backup copy of your API call log on a regular basis. You can do this by using our ",[1614,12720,12723],{"href":12721,"rel":12722},"https://docs.unified.to/unified/apicall/Returns_API_Calls",[1618],"Unified.to Admin API",[19,12725,12726,12727,12730],{},"For example, if you use our Node SDK, you could perform a backup using the ",[109,12728,12729],{},"listUnifiedApicalls()"," method:",[102,12732,12734],{"className":220,"code":12733,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nconst results = await sdk.unified.listUnifiedApicalls({  });\n",[109,12735,12736,12748,12752,12766,12771,12781,12785,12789,12793],{"__ignoreMap":107},[112,12737,12738,12740,12742,12744,12746],{"class":114,"line":115},[112,12739,230],{"class":229},[112,12741,244],{"class":236},[112,12743,247],{"class":229},[112,12745,250],{"class":122},[112,12747,237],{"class":236},[112,12749,12750],{"class":114,"line":126},[112,12751,272],{"emptyLinePlaceholder":271},[112,12753,12754,12756,12758,12760,12762,12764],{"class":114,"line":135},[112,12755,277],{"class":229},[112,12757,351],{"class":129},[112,12759,354],{"class":229},[112,12761,357],{"class":229},[112,12763,360],{"class":118},[112,12765,363],{"class":236},[112,12767,12768],{"class":114,"line":147},[112,12769,12770],{"class":236},"    security: {\n",[112,12772,12773,12776,12779],{"class":114,"line":202},[112,12774,12775],{"class":236},"        jwt: ",[112,12777,12778],{"class":122},"'\u003CYOUR_API_KEY_HERE>'",[112,12780,288],{"class":236},[112,12782,12783],{"class":114,"line":208},[112,12784,988],{"class":236},[112,12786,12787],{"class":114,"line":291},[112,12788,384],{"class":236},[112,12790,12791],{"class":114,"line":299},[112,12792,272],{"emptyLinePlaceholder":271},[112,12794,12795,12797,12800,12802,12804,12807,12810],{"class":114,"line":307},[112,12796,277],{"class":229},[112,12798,12799],{"class":129}," results",[112,12801,354],{"class":229},[112,12803,539],{"class":229},[112,12805,12806],{"class":236}," sdk.unified.",[112,12808,12809],{"class":118},"listUnifiedApicalls",[112,12811,12812],{"class":236},"({  });\n",[1558,12814,12815],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":12817},[],"API call logs are retained for 60 days. Our system removes log entries for API calls that are older than 60 days.",{"img":12820,"date":12821,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_long_are_logs_retained-icon.png","2024-04-02T00:00:00.000Z","/guides/how_long_are_logs_retained",{"title":12697,"description":12818},"guides/how_long_are_logs_retained","P70tvanEUo3uFdPbMh5aXtD8TWGMa8O-bdUuRpDK5eA",{"id":12827,"title":12828,"body":12829,"description":12843,"extension":1576,"meta":13543,"navigation":271,"path":13546,"seo":13547,"stem":13548,"__hash__":13549},"guides/guides/how_to_access_employees_and_users.md","How to access employees and users",{"type":9,"value":12830,"toc":13539},[12831,12834,12836,12841,12844,12858,12909,12925,12929,12932,13486,13489,13495,13501,13507,13510,13514,13536],[12,12832,12828],{"id":12833},"how-to-access-employees-and-users",[16,12835],{},[19,12837,12838],{},[22,12839,12840],{},"June 25, 2024",[19,12842,12843],{},"How do you get information on a customer account's users and employees?",[19,12845,12846,12847,11338,12852,12857],{},"The essential idea is that regardless of whether the integration involves an e-commerce, CRM, or accounting application, user information for a corporate account is consistently accessible through our unified HR API. This is achieved using the HR ",[1614,12848,12851],{"href":12849,"rel":12850},"https://docs.unified.to/hris/employee/Retrieve_an_employee",[1618],"Get Employee",[1614,12853,12856],{"href":12854,"rel":12855},"https://docs.unified.to/hris/employee/List_all_employees",[1618],"List Employees"," API endpoints.",[102,12859,12861],{"className":9951,"code":12860,"language":9953,"meta":107,"style":107},"GET /hris/{connection_id}/employee\n\nGET /hris/{connection_id}/employee/{id}\n",[109,12862,12863,12883,12887],{"__ignoreMap":107},[112,12864,12865,12867,12869,12872,12875,12878,12880],{"class":114,"line":115},[112,12866,2712],{"class":129},[112,12868,4705],{"class":229},[112,12870,12871],{"class":236},"hris",[112,12873,12874],{"class":229},"/",[112,12876,12877],{"class":236},"{connection_id}",[112,12879,12874],{"class":229},[112,12881,12882],{"class":236},"employee\n",[112,12884,12885],{"class":114,"line":126},[112,12886,272],{"emptyLinePlaceholder":271},[112,12888,12889,12891,12893,12895,12897,12899,12901,12904,12906],{"class":114,"line":135},[112,12890,2712],{"class":129},[112,12892,4705],{"class":229},[112,12894,12871],{"class":236},[112,12896,12874],{"class":229},[112,12898,12877],{"class":236},[112,12900,12874],{"class":229},[112,12902,12903],{"class":236},"employee",[112,12905,12874],{"class":229},[112,12907,12908],{"class":236},"{id}\n",[19,12910,12911,12912,12917,12921,12924],{},"There are approximately ",[1614,12913,12916],{"href":12914,"rel":12915},"https://docs.unified.to/hris/integrations",[1618],"120 ",[1614,12918,12920],{"href":12914,"rel":12919},[1618],"integrations",[1614,12922,2251],{"href":12914,"rel":12923},[1618],"that support the HR Employee endpoints.",[35,12926,12928],{"id":12927},"employeeuser-ids-in-all-unified-data-models","Employee/User IDs in all unified data models",[19,12930,12931],{},"Here is a list of different objects across all our unified API categories that link back to an HR Employee via their IDs. Note: We use the terms 'employee' and 'user' interchangeably.",[1868,12933,12934,12948],{},[1871,12935,12936],{},[1874,12937,12938,12941,12944,12946],{},[1877,12939,12940],{},"Category",[1877,12942,12943],{},"Data Model",[1877,12945,2425],{},[1877,12947,1882],{},[1890,12949,12950,12967,12984,13000,13016,13032,13046,13062,13078,13095,13111,13127,13143,13158,13174,13189,13206,13222,13237,13253,13269,13284,13301,13317,13334,13348,13362,13376,13393,13410,13426,13439,13453,13470],{},[1874,12951,12952,12954,12961,12964],{},[1895,12953,12248],{},[1895,12955,12956],{},[1614,12957,12960],{"href":12958,"rel":12959},"https://docs.unified.to/ats/activity/model",[1618],"Activity",[1895,12962,12963],{},"user_ids",[1895,12965,12966],{},"The recruiters associated with this activity",[1874,12968,12969,12971,12978,12981],{},[1895,12970,12248],{},[1895,12972,12973],{},[1614,12974,12977],{"href":12975,"rel":12976},"https://docs.unified.to/ats/candidate/model",[1618],"Candidate",[1895,12979,12980],{},"user_id",[1895,12982,12983],{},"The recruiter or hiring manager associated with this candidate",[1874,12985,12986,12988,12995,12997],{},[1895,12987,12248],{},[1895,12989,12990],{},[1614,12991,12994],{"href":12992,"rel":12993},"https://docs.unified.to/ats/document/model",[1618],"Document",[1895,12996,12980],{},[1895,12998,12999],{},"The user who created this document",[1874,13001,13002,13004,13011,13013],{},[1895,13003,12248],{},[1895,13005,13006],{},[1614,13007,13010],{"href":13008,"rel":13009},"https://docs.unified.to/ats/interview/model",[1618],"Interview",[1895,13012,12963],{},[1895,13014,13015],{},"The employees that were in this interview",[1874,13017,13018,13020,13027,13030],{},[1895,13019,12248],{},[1895,13021,13022],{},[1614,13023,13026],{"href":13024,"rel":13025},"https://docs.unified.to/ats/job/model",[1618],"Job",[1895,13028,13029],{},"recruiter_ids",[1895,13031],{},[1874,13033,13034,13036,13041,13044],{},[1895,13035,12248],{},[1895,13037,13038],{},[1614,13039,13026],{"href":13024,"rel":13040},[1618],[1895,13042,13043],{},"hiring_manager_ids",[1895,13045],{},[1874,13047,13048,13050,13057,13060],{},[1895,13049,12248],{},[1895,13051,13052],{},[1614,13053,13056],{"href":13054,"rel":13055},"https://docs.unified.to/ats/scorecard/model",[1618],"Scorecard",[1895,13058,13059],{},"interviewer_id",[1895,13061],{},[1874,13063,13064,13066,13073,13076],{},[1895,13065,12248],{},[1895,13067,13068],{},[1614,13069,13072],{"href":13070,"rel":13071},"https://docs.unified.to/ats/company/model",[1618],"Company",[1895,13074,13075],{},"recruiters_ids",[1895,13077],{},[1874,13079,13080,13083,13090,13092],{},[1895,13081,13082],{},"Call Center",[1895,13084,13085],{},[1614,13086,13089],{"href":13087,"rel":13088},"https://docs.unified.to/uc/call/model",[1618],"Call",[1895,13091,12980],{},[1895,13093,13094],{},"The agent",[1874,13096,13097,13100,13106,13108],{},[1895,13098,13099],{},"CRM",[1895,13101,13102],{},[1614,13103,13072],{"href":13104,"rel":13105},"https://docs.unified.to/crm/company/model",[1618],[1895,13107,12980],{},[1895,13109,13110],{},"The salesperson that is responsible for this company/account",[1874,13112,13113,13115,13122,13124],{},[1895,13114,13099],{},[1895,13116,13117],{},[1614,13118,13121],{"href":13119,"rel":13120},"https://docs.unified.to/crm/contact/model",[1618],"Contact",[1895,13123,12980],{},[1895,13125,13126],{},"The salesperson that is responsible for this contact",[1874,13128,13129,13131,13138,13140],{},[1895,13130,13099],{},[1895,13132,13133],{},[1614,13134,13137],{"href":13135,"rel":13136},"https://docs.unified.to/crm/deal/model",[1618],"Deal",[1895,13139,12980],{},[1895,13141,13142],{},"The salesperson that is responsible for this deal/opportunity",[1874,13144,13145,13147,13154,13156],{},[1895,13146,13099],{},[1895,13148,13149],{},[1614,13150,13153],{"href":13151,"rel":13152},"https://docs.unified.to/crm/event/model",[1618],"Event",[1895,13155,12980],{},[1895,13157],{},[1874,13159,13160,13162,13169,13171],{},[1895,13161,13099],{},[1895,13163,13164,13165],{},"Lead",[1614,13166,2251],{"href":13167,"rel":13168},"https://docs.unified.to/crm/lead/model",[1618],[1895,13170,12980],{},[1895,13172,13173],{},"The salesperson that is responsible for this lead",[1874,13175,13176,13178,13183,13186],{},[1895,13177,13099],{},[1895,13179,13180],{},[1614,13181,13164],{"href":13167,"rel":13182},[1618],[1895,13184,13185],{},"creator_user_id",[1895,13187,13188],{},"The user that created this lead",[1874,13190,13191,13193,13200,13203],{},[1895,13192,12252],{},[1895,13194,13195],{},[1614,13196,13199],{"href":13197,"rel":13198},"https://docs.unified.to/hris/employee/model",[1618],"Employee",[1895,13201,13202],{},"manager_id",[1895,13204,13205],{},"This user's reporting manager",[1874,13207,13208,13210,13217,13219],{},[1895,13209,12252],{},[1895,13211,13212],{},[1614,13213,13216],{"href":13214,"rel":13215},"https://docs.unified.to/hris/group/model",[1618],"Group",[1895,13218,12963],{},[1895,13220,13221],{},"The group's members",[1874,13223,13224,13226,13231,13234],{},[1895,13225,12252],{},[1895,13227,13228],{},[1614,13229,13216],{"href":13214,"rel":13230},[1618],[1895,13232,13233],{},"manager_ids",[1895,13235,13236],{},"The group's managers",[1874,13238,13239,13241,13248,13250],{},[1895,13240,12252],{},[1895,13242,13243],{},[1614,13244,13247],{"href":13245,"rel":13246},"https://docs.unified.to/hris/payslip/model",[1618],"Payslip",[1895,13249,12980],{},[1895,13251,13252],{},"The employee that this pay slip pertains to",[1874,13254,13255,13257,13264,13266],{},[1895,13256,12252],{},[1895,13258,13259],{},[1614,13260,13263],{"href":13261,"rel":13262},"https://docs.unified.to/hris/timeoff/model",[1618],"Timeoff",[1895,13265,12980],{},[1895,13267,13268],{},"The employee that this time off request pertains to",[1874,13270,13271,13273,13278,13281],{},[1895,13272,12252],{},[1895,13274,13275],{},[1614,13276,13263],{"href":13261,"rel":13277},[1618],[1895,13279,13280],{},"approver_user_id",[1895,13282,13283],{},"The employee that approved this time off request",[1874,13285,13286,13289,13296,13298],{},[1895,13287,13288],{},"KMS",[1895,13290,13291],{},[1614,13292,13295],{"href":13293,"rel":13294},"https://docs.unified.to/kms/space/model",[1618],"Space",[1895,13297,12980],{},[1895,13299,13300],{},"The creator of this space",[1874,13302,13303,13305,13312,13314],{},[1895,13304,13288],{},[1895,13306,13307],{},[1614,13308,13311],{"href":13309,"rel":13310},"https://docs.unified.to/kms/page/model",[1618],"Page",[1895,13313,12980],{},[1895,13315,13316],{},"The creator of this oage",[1874,13318,13319,13322,13329,13332],{},[1895,13320,13321],{},"Messaging",[1895,13323,13324],{},[1614,13325,13328],{"href":13326,"rel":13327},"https://docs.unified.to/messaging/message/model",[1618],"Message",[1895,13330,13331],{},"author_member.user_id",[1895,13333],{},[1874,13335,13336,13338,13343,13346],{},[1895,13337,13321],{},[1895,13339,13340],{},[1614,13341,13328],{"href":13326,"rel":13342},[1618],[1895,13344,13345],{},"destination_members.user_id",[1895,13347],{},[1874,13349,13350,13352,13357,13360],{},[1895,13351,13321],{},[1895,13353,13354],{},[1614,13355,13328],{"href":13326,"rel":13356},[1618],[1895,13358,13359],{},"hidden_members.user_id",[1895,13361],{},[1874,13363,13364,13366,13371,13374],{},[1895,13365,13321],{},[1895,13367,13368],{},[1614,13369,13328],{"href":13326,"rel":13370},[1618],[1895,13372,13373],{},"mentioned_members.user_id",[1895,13375],{},[1874,13377,13378,13381,13388,13390],{},[1895,13379,13380],{},"Storage",[1895,13382,13383],{},[1614,13384,13387],{"href":13385,"rel":13386},"https://docs.unified.to/storage/file/model",[1618],"File",[1895,13389,12980],{},[1895,13391,13392],{},"The owner of this file/folder",[1874,13394,13395,13398,13405,13407],{},[1895,13396,13397],{},"Tasks",[1895,13399,13400],{},[1614,13401,13404],{"href":13402,"rel":13403},"https://docs.unified.to/task/project/model",[1618],"Project",[1895,13406,12963],{},[1895,13408,13409],{},"The users that belong to this project",[1874,13411,13412,13414,13421,13424],{},[1895,13413,13397],{},[1895,13415,13416],{},[1614,13417,13420],{"href":13418,"rel":13419},"https://docs.unified.to/task/task/model",[1618],"Task",[1895,13422,13423],{},"assigned_user_id",[1895,13425],{},[1874,13427,13428,13430,13435,13437],{},[1895,13429,13397],{},[1895,13431,13432],{},[1614,13433,13420],{"href":13418,"rel":13434},[1618],[1895,13436,13185],{},[1895,13438],{},[1874,13440,13441,13443,13448,13451],{},[1895,13442,13397],{},[1895,13444,13445],{},[1614,13446,13420],{"href":13418,"rel":13447},[1618],[1895,13449,13450],{},"follower_user_ids",[1895,13452],{},[1874,13454,13455,13458,13465,13467],{},[1895,13456,13457],{},"Ticketing",[1895,13459,13460],{},[1614,13461,13464],{"href":13462,"rel":13463},"https://docs.unified.to/ticketing/note/model",[1618],"Note",[1895,13466,12980],{},[1895,13468,13469],{},"The user who created this note",[1874,13471,13472,13474,13481,13483],{},[1895,13473,13457],{},[1895,13475,13476],{},[1614,13477,13480],{"href":13478,"rel":13479},"https://docs.unified.to/ticketing/ticket/model",[1618],"Ticket",[1895,13482,12980],{},[1895,13484,13485],{},"The user who created this ticket",[19,13487,13488],{},"Here are several practical use cases that leverage our unified HR API for non-HR use-cases:",[19,13490,13491,13494],{},[478,13492,13493],{},"Streamlined Onboarding:"," Automate your customers' onboarding process by syncing employee data across HR, task management, and training platforms. Ensure that new hires are promptly added to all necessary systems and have access to the right resources from day one.",[19,13496,13497,13500],{},[478,13498,13499],{},"Assigning Leads and Deals:"," Assign newly created leads and/or deals to a specific sales-rep using their user ID",[19,13502,13503,13506],{},[478,13504,13505],{},"Notify Hiring Managers:"," When adding a new candidate and their job application, notify the hiring manager by retrieving their information and emailing them",[19,13508,13509],{},"By integrating employee data across multiple SaaS platforms, organizations can improve operational efficiency, enhance data accuracy, and provide a better employee experience.",[67,13511,13513],{"id":13512},"resources","Resources",[72,13515,13516,13522,13529],{},[46,13517,13518],{},[12408,13519],{"width":12410,"height":12411,"src":13520,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},"https://www.youtube.com/embed/arTwN_OT8Do?feature=shared","strict-origin-when-cross-origin",[46,13523,13524],{},[1614,13525,13528],{"href":13526,"rel":13527},"https://docs.unified.to/hris/overview",[1618],"Overview of our unified HR API documentation ",[46,13530,13531],{},[1614,13532,13535],{"href":13533,"rel":13534},"https://unified.to/hris",[1618],"Full list of supported HR integrations ",[1558,13537,13538],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":13540},[13541,13542],{"id":12927,"depth":135,"text":12928},{"id":13512,"depth":126,"text":13513},{"img":13544,"date":13545,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_access_employees_and_users-icon.png","2024-06-25T00:00:00.000Z","/guides/how_to_access_employees_and_users",{"title":12828,"description":12843},"guides/how_to_access_employees_and_users","h53RrUxR1focCTVm9wuZMJ4_suo2oTopNh50BWf376w",{"id":13551,"title":13552,"body":13553,"description":13596,"extension":1576,"meta":13597,"navigation":271,"path":13600,"seo":13601,"stem":13602,"__hash__":13603},"guides/guides/how_to_add_api_support_for_the_create_activity_in_crelate.md","How to add API support for the Create Activity in Crelate",{"type":9,"value":13554,"toc":13594},[13555,13558,13560,13565,13568,13571,13585,13591],[12,13556,13552],{"id":13557},"how-to-add-api-support-for-the-create-activity-in-crelate",[16,13559],{},[19,13561,13562],{},[22,13563,13564],{},"September 25, 2025",[19,13566,13567],{},"Here's how to configure Activity Types properly.",[19,13569,13570],{},"First off, you need to set \"Available On\" for Activity Types:",[43,13572,13573,13576,13579,13582],{},[46,13574,13575],{},"Navigate to Settings → Activities",[46,13577,13578],{},"Select the specific Activity Type you want to configure",[46,13580,13581],{},"Find the Available On section - this determines which record types the Activity will appear on",[46,13583,13584],{},"Critical: By default, Activity Types are set to no records and must be configured or they'll be unavailable for use",[19,13586,13587],{},[1603,13588],{"alt":13589,"src":13590},"image.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_add_api_support_for_the_create_activity_in_crelate-0.png",[19,13592,13593],{},"The settings shown in the image above will enable the maximum number of API features.",{"title":107,"searchDepth":126,"depth":126,"links":13595},[],"First off, you need to set \"Available On\" for Activity Types,",{"img":13598,"date":13599,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_add_api_support_for_the_create_activity_in_crelate-icon.png","2025-09-25T00:00:00.000Z","/guides/how_to_add_api_support_for_the_create_activity_in_crelate",{"title":13552,"description":13596},"guides/how_to_add_api_support_for_the_create_activity_in_crelate","pXZROXiK6R_rCPV-aJtvz4im3uKXc9d-OHPvTEj0qFQ",{"id":13605,"title":13606,"body":13607,"description":13621,"extension":1576,"meta":14152,"navigation":271,"path":14155,"seo":14156,"stem":14157,"__hash__":14158},"guides/guides/how_to_associate_a_connection_id_with_your_end_user.md","How to Associate a Connection ID with Your End-User",{"type":9,"value":13608,"toc":14146},[13609,13612,13614,13619,13622,13625,13628,13631,13635,13638,13651,13655,13662,13963,13967,13981,14098,14102,14143],[12,13610,13606],{"id":13611},"how-to-associate-a-connection-id-with-your-end-user",[16,13613],{},[19,13615,13616],{},[22,13617,13618],{},"April 4, 2024",[19,13620,13621],{},"This guide explains how to associate connections you create through Unified.to with end-users in your own application.",[19,13623,13624],{},"When your end-users authorize access to third-party applications through Unified.to, you need a way to keep track of which connections belong to which users in your application. This guide covers two ways to accomplish this, with recommendations on when to use each approach.",[19,13626,13627],{},"If you prefer to learn through video, check out our guide on YouTube:",[12408,13629],{"width":12410,"height":12411,"src":13630,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},"https://www.youtube.com/embed/OW-1vE04cFw?si=EGXIESpEGgYSq0j8",[67,13632,13634],{"id":13633},"before-you-begin","Before you begin",[19,13636,13637],{},"This guide assumes you have:",[72,13639,13640,13648],{},[46,13641,13642,13643],{},"A basic understanding of ",[1614,13644,13647],{"href":13645,"rel":13646},"https://unified.to/blog/end_users_integrations_and_connections",[1618],"end-users, integrations, and connections",[46,13649,13650],{},"Familiarity with OAuth 2.0 authorization flows",[67,13652,13654],{"id":13653},"method-1-use-the-state-parameter-recommended","Method 1: Use the state parameter (recommended)",[19,13656,13657,13658,13661],{},"The state parameter provides a secure way to maintain context throughout the OAuth flow by passing data between your authorization request and the callback. The state parameter ",[22,13659,13660],{},"does not"," change during authorization. Whatever value you put into the state parameter in the authorization URL is the same value that will be extracted from the success URL.",[43,13663,13664,13739,13784,13823],{},[46,13665,13666,13667],{},"Create a state object with your user's ID, passing in additional security measures like a hashing signature. For example:",[102,13668,13670],{"className":9951,"code":13669,"language":9953,"meta":107,"style":107},"const stateObject = {\n  user_id: \"xyz789\",\n  nonce: generateRandomString(), // Add randomness for security\n  timestamp: Date.now(), // Optional: Add timestamp for expiry checking\n  sig: generateSignature() // Optional: Add signature for verification\n};\n",[109,13671,13672,13683,13693,13707,13720,13734],{"__ignoreMap":107},[112,13673,13674,13676,13679,13681],{"class":114,"line":115},[112,13675,277],{"class":229},[112,13677,13678],{"class":129}," stateObject",[112,13680,354],{"class":229},[112,13682,280],{"class":236},[112,13684,13685,13688,13691],{"class":114,"line":126},[112,13686,13687],{"class":236},"  user_id: ",[112,13689,13690],{"class":122},"\"xyz789\"",[112,13692,288],{"class":236},[112,13694,13695,13698,13701,13704],{"class":114,"line":135},[112,13696,13697],{"class":236},"  nonce: ",[112,13699,13700],{"class":118},"generateRandomString",[112,13702,13703],{"class":236},"(), ",[112,13705,13706],{"class":578},"// Add randomness for security\n",[112,13708,13709,13712,13715,13717],{"class":114,"line":147},[112,13710,13711],{"class":236},"  timestamp: Date.",[112,13713,13714],{"class":118},"now",[112,13716,13703],{"class":236},[112,13718,13719],{"class":578},"// Optional: Add timestamp for expiry checking\n",[112,13721,13722,13725,13728,13731],{"class":114,"line":202},[112,13723,13724],{"class":236},"  sig: ",[112,13726,13727],{"class":118},"generateSignature",[112,13729,13730],{"class":236},"() ",[112,13732,13733],{"class":578},"// Optional: Add signature for verification\n",[112,13735,13736],{"class":114,"line":208},[112,13737,13738],{"class":236},"};\n",[46,13740,13741,13742],{},"Encode the state object as a base64-string:",[102,13743,13745],{"className":9951,"code":13744,"language":9953,"meta":107,"style":107},"const encodedState = Buffer.from(JSON.stringify(stateObject)).toString('base64');\n",[109,13746,13747],{"__ignoreMap":107},[112,13748,13749,13751,13754,13756,13759,13761,13763,13766,13768,13771,13774,13777,13779,13782],{"class":114,"line":115},[112,13750,277],{"class":229},[112,13752,13753],{"class":129}," encodedState",[112,13755,354],{"class":229},[112,13757,13758],{"class":236}," Buffer.",[112,13760,247],{"class":118},[112,13762,456],{"class":236},[112,13764,13765],{"class":129},"JSON",[112,13767,634],{"class":236},[112,13769,13770],{"class":118},"stringify",[112,13772,13773],{"class":236},"(stateObject)).",[112,13775,13776],{"class":118},"toString",[112,13778,456],{"class":236},[112,13780,13781],{"class":122},"'base64'",[112,13783,464],{"class":236},[46,13785,13786,13787],{},"Add the encoded state to your authorization URL",[102,13788,13790],{"className":9951,"code":13789,"language":9953,"meta":107,"style":107},"const authUrl = `https://api.unified.to/unified/integration/auth/${workspace_id}/${integration}?state=${encodedState}`;\n",[109,13791,13792],{"__ignoreMap":107},[112,13793,13794,13796,13799,13801,13804,13807,13810,13813,13816,13819,13821],{"class":114,"line":115},[112,13795,277],{"class":229},[112,13797,13798],{"class":129}," authUrl",[112,13800,354],{"class":229},[112,13802,13803],{"class":122}," `https://api.unified.to/unified/integration/auth/${",[112,13805,13806],{"class":236},"workspace_id",[112,13808,13809],{"class":122},"}/${",[112,13811,13812],{"class":236},"integration",[112,13814,13815],{"class":122},"}?state=${",[112,13817,13818],{"class":236},"encodedState",[112,13820,640],{"class":122},[112,13822,237],{"class":236},[46,13824,13825,13826,13828,13829],{},"Handle the callback after successful authorization. The connection ID is included in the URL as ",[109,13827,2442],{},". For example:",[102,13830,13832],{"className":9951,"code":13831,"language":9953,"meta":107,"style":107},"// In your callback handler\nfunction handleCallback(req, res) {\n// Get connection ID from the callback URL\n  const connectionId = req.query.id;\n\n// Decode and verify the state\n  const decodedState = JSON.parse(Buffer.from(req.query.state, 'base64').toString());\n\n// Verify the state is valid (check signature, nonce, timestamp if used)\n  if (verifyState(decodedState)) {\n// Associate the connection ID with the user ID in your database\n    await saveUserConnection(decodedState.user_id, connectionId);\n  }\n}\n",[109,13833,13834,13839,13858,13863,13875,13879,13884,13918,13922,13927,13940,13945,13955,13959],{"__ignoreMap":107},[112,13835,13836],{"class":114,"line":115},[112,13837,13838],{"class":578},"// In your callback handler\n",[112,13840,13841,13843,13846,13848,13851,13853,13856],{"class":114,"line":126},[112,13842,9978],{"class":229},[112,13844,13845],{"class":118}," handleCallback",[112,13847,456],{"class":236},[112,13849,13850],{"class":517},"req",[112,13852,1046],{"class":236},[112,13854,13855],{"class":517},"res",[112,13857,526],{"class":236},[112,13859,13860],{"class":114,"line":135},[112,13861,13862],{"class":578},"// Get connection ID from the callback URL\n",[112,13864,13865,13867,13870,13872],{"class":114,"line":147},[112,13866,531],{"class":229},[112,13868,13869],{"class":129}," connectionId",[112,13871,354],{"class":229},[112,13873,13874],{"class":236}," req.query.id;\n",[112,13876,13877],{"class":114,"line":202},[112,13878,272],{"emptyLinePlaceholder":271},[112,13880,13881],{"class":114,"line":208},[112,13882,13883],{"class":578},"// Decode and verify the state\n",[112,13885,13886,13888,13891,13893,13896,13898,13901,13904,13906,13909,13911,13913,13915],{"class":114,"line":291},[112,13887,531],{"class":229},[112,13889,13890],{"class":129}," decodedState",[112,13892,354],{"class":229},[112,13894,13895],{"class":129}," JSON",[112,13897,634],{"class":236},[112,13899,13900],{"class":118},"parse",[112,13902,13903],{"class":236},"(Buffer.",[112,13905,247],{"class":118},[112,13907,13908],{"class":236},"(req.query.state, ",[112,13910,13781],{"class":122},[112,13912,772],{"class":236},[112,13914,13776],{"class":118},[112,13916,13917],{"class":236},"());\n",[112,13919,13920],{"class":114,"line":299},[112,13921,272],{"emptyLinePlaceholder":271},[112,13923,13924],{"class":114,"line":307},[112,13925,13926],{"class":578},"// Verify the state is valid (check signature, nonce, timestamp if used)\n",[112,13928,13929,13932,13934,13937],{"class":114,"line":315},[112,13930,13931],{"class":229},"  if",[112,13933,1419],{"class":236},[112,13935,13936],{"class":118},"verifyState",[112,13938,13939],{"class":236},"(decodedState)) {\n",[112,13941,13942],{"class":114,"line":323},[112,13943,13944],{"class":578},"// Associate the connection ID with the user ID in your database\n",[112,13946,13947,13949,13952],{"class":114,"line":329},[112,13948,1466],{"class":229},[112,13950,13951],{"class":118}," saveUserConnection",[112,13953,13954],{"class":236},"(decodedState.user_id, connectionId);\n",[112,13956,13957],{"class":114,"line":341},[112,13958,1476],{"class":236},[112,13960,13961],{"class":114,"line":346},[112,13962,584],{"class":236},[67,13964,13966],{"id":13965},"method-2-use-the-external-id-parameter","Method 2: Use the external ID parameter",[19,13968,13969,13970,13973,13974,13976,13977,13980],{},"This method leverages Unified.to's built-in external ID (",[109,13971,13972],{},"uid",") field to store your user associations. The success URL contains another parameter, ",[109,13975,13972],{},", also known as the ",[478,13978,13979],{},"External ID"," parameter, which can be used to map to your end-user's ID.",[43,13982,13983,14016],{},[46,13984,13985,13986],{},"Add the external ID parameter to your authorization URL",[102,13987,13989],{"className":9951,"code":13988,"language":9953,"meta":107,"style":107},"const authUrl = `https://api.unified.to/unified/integration/auth/${workspace_id}/${integration}?uid=${user_id}`;\n",[109,13990,13991],{"__ignoreMap":107},[112,13992,13993,13995,13997,13999,14001,14003,14005,14007,14010,14012,14014],{"class":114,"line":115},[112,13994,277],{"class":229},[112,13996,13798],{"class":129},[112,13998,354],{"class":229},[112,14000,13803],{"class":122},[112,14002,13806],{"class":236},[112,14004,13809],{"class":122},[112,14006,13812],{"class":236},[112,14008,14009],{"class":122},"}?uid=${",[112,14011,12980],{"class":236},[112,14013,640],{"class":122},[112,14015,237],{"class":236},[46,14017,14018,14019],{},"Once a connection is created, that external ID is stored in the connection object. You can now query connections using the external ID:",[102,14020,14022],{"className":9951,"code":14021,"language":9953,"meta":107,"style":107},"const options = {\n  method: 'GET',\n  url: 'https://api.unified.to/unified/connection',\n  headers: {\n    'authorization': `Bearer ${unified_api_key}`\n  },\n  params: {\n    external_xref: user_id\n  }\n};\n",[109,14023,14024,14035,14045,14055,14060,14076,14080,14085,14090,14094],{"__ignoreMap":107},[112,14025,14026,14028,14031,14033],{"class":114,"line":115},[112,14027,277],{"class":229},[112,14029,14030],{"class":129}," options",[112,14032,354],{"class":229},[112,14034,280],{"class":236},[112,14036,14037,14040,14043],{"class":114,"line":126},[112,14038,14039],{"class":236},"  method: ",[112,14041,14042],{"class":122},"'GET'",[112,14044,288],{"class":236},[112,14046,14047,14050,14053],{"class":114,"line":135},[112,14048,14049],{"class":236},"  url: ",[112,14051,14052],{"class":122},"'https://api.unified.to/unified/connection'",[112,14054,288],{"class":236},[112,14056,14057],{"class":114,"line":147},[112,14058,14059],{"class":236},"  headers: {\n",[112,14061,14062,14065,14067,14070,14073],{"class":114,"line":202},[112,14063,14064],{"class":122},"    'authorization'",[112,14066,2335],{"class":236},[112,14068,14069],{"class":122},"`Bearer ${",[112,14071,14072],{"class":236},"unified_api_key",[112,14074,14075],{"class":122},"}`\n",[112,14077,14078],{"class":114,"line":208},[112,14079,9512],{"class":236},[112,14081,14082],{"class":114,"line":291},[112,14083,14084],{"class":236},"  params: {\n",[112,14086,14087],{"class":114,"line":299},[112,14088,14089],{"class":236},"    external_xref: user_id\n",[112,14091,14092],{"class":114,"line":307},[112,14093,1476],{"class":236},[112,14095,14096],{"class":114,"line":315},[112,14097,13738],{"class":236},[67,14099,14101],{"id":14100},"best-practices-for-implementation","Best practices for implementation",[43,14103,14104,14117,14130],{},[46,14105,14106,14109],{},[478,14107,14108],{},"Always validate the state parameter",[72,14110,14111,14114],{},[46,14112,14113],{},"Check signatures if used",[46,14115,14116],{},"Verify nonces haven't been reused",[46,14118,14119,14122],{},[478,14120,14121],{},"Securely store connection associations",[72,14123,14124,14127],{},[46,14125,14126],{},"Use a database to map user IDs to connection IDs",[46,14128,14129],{},"Consider encrypting sensitive data",[46,14131,14132,14135],{},[478,14133,14134],{},"Handle error cases",[72,14136,14137,14140],{},[46,14138,14139],{},"Missing parameters",[46,14141,14142],{},"Failed authorization attempts",[1558,14144,14145],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}",{"title":107,"searchDepth":126,"depth":126,"links":14147},[14148,14149,14150,14151],{"id":13633,"depth":126,"text":13634},{"id":13653,"depth":126,"text":13654},{"id":13965,"depth":126,"text":13966},{"id":14100,"depth":126,"text":14101},{"img":14153,"date":14154,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_associate_a_connection_id_with_your_end_user-icon.png","2024-04-04T00:00:00.000Z","/guides/how_to_associate_a_connection_id_with_your_end_user",{"title":13606,"description":13621},"guides/how_to_associate_a_connection_id_with_your_end_user","8jSSJbjYmsb6aNi5YmD6wD9IWC1ndiXyoMK6h3gCld0",{"id":14160,"title":14161,"body":14162,"description":16339,"extension":1576,"meta":16340,"navigation":271,"path":16343,"seo":16344,"stem":16345,"__hash__":16346},"guides/guides/how_to_build_a_candidate_assessment_product_with_unified.md","How to build a Candidate Assessment product with Unified.to",{"type":9,"value":14163,"toc":16329},[14164,14167,14169,14174,14177,14184,14187,14190,14193,14197,14204,14208,14219,14223,14252,14256,14259,14266,16235,16239,16242,16268,16271,16275,16297,16301,16326],[12,14165,14161],{"id":14166},"how-to-build-a-candidate-assessment-product-with-unifiedto",[16,14168],{},[19,14170,14171],{},[22,14172,14173],{},"October 23, 2023",[12408,14175],{"width":12410,"height":12411,"src":14176,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},"https://www.youtube.com/embed/0hfH39vh7Qk",[19,14178,14179,14180,14183],{},"There are two different ways that you can build a candidate assessment solution. Some ATS providers will allow for an assessment solution to register with them and then call your server with an assessment request. Unfortunately, not many ATS providers support this method, so ",[1614,14181,1640],{"href":1638,"rel":14182},[1618]," only supports this method that is widely supported.",[19,14185,14186],{},"In the high-paced realm of recruitment, where talent acquisition meets the evolving landscape of HR technology, the need for efficient and robust Candidate Assessment tools has never been more crucial. As companies strive to identify top talent, incorporating candidate assessment software that facilitates critical activities like background checks, skills tests, candidate analytics analysis and more not only expedites the screening process but also ensures a comprehensive and data-driven approach to talent acquisition.",[19,14188,14189],{},"This guide explore how to develop robust and scalable Candidate Assessment software by leveraging third-party integrations through Unified.to's Unified API developer platform to enhance the value of your candidate assessment solution.",[19,14191,14192],{},"For teams building AI-driven screening or semantic resume matching, this same architecture can also power retrieval-augmented generation (RAG) workflows on top of ATS data.",[67,14194,14196],{"id":14195},"who","Who",[19,14198,14199,14200,14203],{},"You have built a  ",[109,14201,14202],{},"Candidate Assessment"," solution for recruiters and hiring managers, enabling them to evaluate candidates who are applying for positions within their companies.",[67,14205,14207],{"id":14206},"why-your-goal","Why (your goal)",[72,14209,14210,14216],{},[46,14211,14212,14213,14215],{},"You need to access your customers' ",[109,14214,12248],{}," (application tracking systems) to automate the data flow of new applications so that your solution can test and assess their candidates.",[46,14217,14218],{},"Retrieve resumes and job descriptions to power RAG-based candidate ranking and semantic matching.",[67,14220,14222],{"id":14221},"what","What",[19,14224,14225,14226,1046,14231,1046,14236,1046,14241,14246,14247,14251],{},"You will need to integrate seamlessly with the leading ATS solutions utilized by your customers, such as  ",[1614,14227,14230],{"href":14228,"rel":14229},"https://unified.to/integrations/greenhouse",[1618],"Greenhouse",[1614,14232,14235],{"href":14233,"rel":14234},"https://unified.to/integrations/lever",[1618],"Lever",[1614,14237,14240],{"href":14238,"rel":14239},"https://unified.to/integrations/smartrecruiters",[1618],"SmartRecruiters",[1614,14242,14245],{"href":14243,"rel":14244},"https://unified.to/integrations/successfactors",[1618],"SAP SuccessFactors",", and ",[1614,14248,14250],{"href":1710,"rel":14249},[1618],"more",". This will provide your users with a streamlined user experience, ensuring efficient data flow and synchronization between your Candidate Assessment solution and their preferred Applicant Tracking Systems (ATS).",[67,14253,14255],{"id":14254},"how-to-add-ats-integrations-to-your-product","How to add ATS integrations to your product",[19,14257,14258],{},"Before we start, be sure to first read:",[19,14260,14261],{},[1614,14262,14265],{"href":14263,"rel":14264},"https://unified.to/blog/start_here_getting_started_with_unified",[1618],"Getting Started with Unified",[43,14267,14268,14649,15383,15455,15740],{},[46,14269,14270,14273],{},[478,14271,14272],{},"Get an initial list of applications",[43,14274,14275],{},[46,14276,14277,14278,14283],{},"When the customer authorizes an ATS connection, ",[1614,14279,14282],{"href":14280,"rel":14281},"https://docs.unified.to/ats/application/List_all_applications",[1618],"read the initial set of active applications",[102,14284,14286],{"className":220,"code":14285,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AtsApplication, AtsApplicationStatus } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function getApplications(connectionId: string, trigger_status: AtsApplicationStatus, jobId: string, updatedGte?: Date) {\n    const applications: AtsApplication[] = [];\n    const limit = 100;\n    let offset = 0;\n\n    while (true) {\n        const result = await sdk.ats.listAtsApplications({\n            updatedGte,\n            jobId,\n            offset,\n            limit,\n            connectionId,\n        });\n\n        const apps = result.atsApplications || [];\n\n        applications.push(...apps.filter((application) => application.status === trigger_status));\n\n        if (apps.length === limit) {\n            offset += limit;\n        } else {\n            break;\n        }\n    }\n\n    return applications;\n}\n",[109,14287,14288,14300,14314,14318,14332,14336,14344,14348,14352,14356,14405,14424,14438,14453,14457,14468,14486,14491,14496,14501,14506,14511,14516,14520,14536,14540,14577,14581,14598,14609,14619,14626,14630,14634,14638,14645],{"__ignoreMap":107},[112,14289,14290,14292,14294,14296,14298],{"class":114,"line":115},[112,14291,230],{"class":229},[112,14293,244],{"class":236},[112,14295,247],{"class":229},[112,14297,250],{"class":122},[112,14299,237],{"class":236},[112,14301,14302,14304,14307,14309,14312],{"class":114,"line":126},[112,14303,230],{"class":229},[112,14305,14306],{"class":236}," { AtsApplication, AtsApplicationStatus } ",[112,14308,247],{"class":229},[112,14310,14311],{"class":122}," '@unified-api/typescript-sdk/dist/sdk/models/shared'",[112,14313,237],{"class":236},[112,14315,14316],{"class":114,"line":135},[112,14317,272],{"emptyLinePlaceholder":271},[112,14319,14320,14322,14324,14326,14328,14330],{"class":114,"line":147},[112,14321,277],{"class":229},[112,14323,351],{"class":129},[112,14325,354],{"class":229},[112,14327,357],{"class":229},[112,14329,360],{"class":118},[112,14331,363],{"class":236},[112,14333,14334],{"class":114,"line":202},[112,14335,12770],{"class":236},[112,14337,14338,14340,14342],{"class":114,"line":208},[112,14339,12775],{"class":236},[112,14341,12778],{"class":122},[112,14343,288],{"class":236},[112,14345,14346],{"class":114,"line":291},[112,14347,988],{"class":236},[112,14349,14350],{"class":114,"line":299},[112,14351,384],{"class":236},[112,14353,14354],{"class":114,"line":307},[112,14355,272],{"emptyLinePlaceholder":271},[112,14357,14358,14360,14362,14364,14367,14369,14371,14373,14375,14377,14380,14382,14385,14387,14390,14392,14394,14396,14399,14401,14403],{"class":114,"line":315},[112,14359,503],{"class":229},[112,14361,506],{"class":229},[112,14363,509],{"class":229},[112,14365,14366],{"class":118}," getApplications",[112,14368,456],{"class":236},[112,14370,518],{"class":517},[112,14372,171],{"class":229},[112,14374,523],{"class":129},[112,14376,1046],{"class":236},[112,14378,14379],{"class":517},"trigger_status",[112,14381,171],{"class":229},[112,14383,14384],{"class":118}," AtsApplicationStatus",[112,14386,1046],{"class":236},[112,14388,14389],{"class":517},"jobId",[112,14391,171],{"class":229},[112,14393,523],{"class":129},[112,14395,1046],{"class":236},[112,14397,14398],{"class":517},"updatedGte",[112,14400,10309],{"class":229},[112,14402,10330],{"class":118},[112,14404,526],{"class":236},[112,14406,14407,14409,14412,14414,14417,14420,14422],{"class":114,"line":323},[112,14408,1435],{"class":229},[112,14410,14411],{"class":129}," applications",[112,14413,171],{"class":229},[112,14415,14416],{"class":118}," AtsApplication",[112,14418,14419],{"class":236},"[] ",[112,14421,335],{"class":229},[112,14423,1292],{"class":236},[112,14425,14426,14428,14431,14433,14436],{"class":114,"line":329},[112,14427,1435],{"class":229},[112,14429,14430],{"class":129}," limit",[112,14432,354],{"class":229},[112,14434,14435],{"class":129}," 100",[112,14437,237],{"class":236},[112,14439,14440,14443,14446,14448,14451],{"class":114,"line":341},[112,14441,14442],{"class":229},"    let",[112,14444,14445],{"class":236}," offset ",[112,14447,335],{"class":229},[112,14449,14450],{"class":129}," 0",[112,14452,237],{"class":236},[112,14454,14455],{"class":114,"line":346},[112,14456,272],{"emptyLinePlaceholder":271},[112,14458,14459,14462,14464,14466],{"class":114,"line":366},[112,14460,14461],{"class":229},"    while",[112,14463,1419],{"class":236},[112,14465,1340],{"class":129},[112,14467,526],{"class":236},[112,14469,14470,14473,14475,14477,14479,14481,14484],{"class":114,"line":381},[112,14471,14472],{"class":229},"        const",[112,14474,911],{"class":129},[112,14476,354],{"class":229},[112,14478,539],{"class":229},[112,14480,542],{"class":236},[112,14482,14483],{"class":118},"listAtsApplications",[112,14485,363],{"class":236},[112,14487,14488],{"class":114,"line":387},[112,14489,14490],{"class":236},"            updatedGte,\n",[112,14492,14493],{"class":114,"line":392},[112,14494,14495],{"class":236},"            jobId,\n",[112,14497,14498],{"class":114,"line":409},[112,14499,14500],{"class":236},"            offset,\n",[112,14502,14503],{"class":114,"line":422},[112,14504,14505],{"class":236},"            limit,\n",[112,14507,14508],{"class":114,"line":435},[112,14509,14510],{"class":236},"            connectionId,\n",[112,14512,14513],{"class":114,"line":440},[112,14514,14515],{"class":236},"        });\n",[112,14517,14518],{"class":114,"line":4949},[112,14519,272],{"emptyLinePlaceholder":271},[112,14521,14522,14524,14527,14529,14532,14534],{"class":114,"line":4960},[112,14523,14472],{"class":229},[112,14525,14526],{"class":129}," apps",[112,14528,354],{"class":229},[112,14530,14531],{"class":236}," result.atsApplications ",[112,14533,1109],{"class":229},[112,14535,1292],{"class":236},[112,14537,14538],{"class":114,"line":4972},[112,14539,272],{"emptyLinePlaceholder":271},[112,14541,14542,14545,14548,14550,14553,14556,14559,14561,14564,14566,14568,14571,14574],{"class":114,"line":4984},[112,14543,14544],{"class":236},"        applications.",[112,14546,14547],{"class":118},"push",[112,14549,456],{"class":236},[112,14551,14552],{"class":229},"...",[112,14554,14555],{"class":236},"apps.",[112,14557,14558],{"class":118},"filter",[112,14560,735],{"class":236},[112,14562,14563],{"class":517},"application",[112,14565,745],{"class":236},[112,14567,748],{"class":229},[112,14569,14570],{"class":236}," application.status ",[112,14572,14573],{"class":229},"===",[112,14575,14576],{"class":236}," trigger_status));\n",[112,14578,14579],{"class":114,"line":4992},[112,14580,272],{"emptyLinePlaceholder":271},[112,14582,14583,14586,14589,14592,14595],{"class":114,"line":5000},[112,14584,14585],{"class":229},"        if",[112,14587,14588],{"class":236}," (apps.",[112,14590,14591],{"class":129},"length",[112,14593,14594],{"class":229}," ===",[112,14596,14597],{"class":236}," limit) {\n",[112,14599,14600,14603,14606],{"class":114,"line":5008},[112,14601,14602],{"class":236},"            offset ",[112,14604,14605],{"class":229},"+=",[112,14607,14608],{"class":236}," limit;\n",[112,14610,14611,14614,14617],{"class":114,"line":5016},[112,14612,14613],{"class":236},"        } ",[112,14615,14616],{"class":229},"else",[112,14618,280],{"class":236},[112,14620,14621,14624],{"class":114,"line":5024},[112,14622,14623],{"class":229},"            break",[112,14625,237],{"class":236},[112,14627,14628],{"class":114,"line":5032},[112,14629,4052],{"class":236},[112,14631,14632],{"class":114,"line":5040},[112,14633,3946],{"class":236},[112,14635,14636],{"class":114,"line":5046},[112,14637,272],{"emptyLinePlaceholder":271},[112,14639,14640,14642],{"class":114,"line":5052},[112,14641,572],{"class":229},[112,14643,14644],{"class":236}," applications;\n",[112,14646,14647],{"class":114,"line":5061},[112,14648,584],{"class":236},[46,14650,14651,14654],{},[478,14652,14653],{},"Set up to get updated applications",[43,14655,14656,15375],{},[46,14657,14658,14659,14664,14665,14667],{},"If you want to use webhooks to get new/updated applications in the future, ",[1614,14660,14663],{"href":14661,"rel":14662},"https://docs.unified.to/unified/webhook/Create_webhook_subscription",[1618],"create a webhook"," with that ",[109,14666,2886],{},[102,14668,14670],{"className":220,"code":14669,"language":222,"meta":107,"style":107},"import { createHmac } from 'crypto';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AtsApplication, AtsApplicationStatus, Event, ObjectType, WebhookType } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\ninterface IncomingWebhook {\n    id: string;\n    created_at: Date;\n    updated_at: Date;\n    workspace_id: string;\n    connection_id: string;\n    hook_url: string;\n    object_type: TObjectType;\n    interval: number;\n    checked_at: Date;\n    integration_type: string;\n    environment: string;\n    event: Event;\n    runs: string[];\n    fields: string;\n    webhook_type: WebhookType;\n    is_healthy: boolean;\n    page_max_limit: number;\n}\n\ninterface IWebhookData\u003CT> {\n    data: T[]; // The data array will contact an array of specific objects according to the webhook's connection. (eg. CRM Contacts)\n    webhook: IncomingWebhook; // The webhook object\n    nonce: string; // random string\n    sig: string; // HMAC-SHA1(workspace.secret, data + nonce)\n    type: 'INITIAL-PARTIAL' | 'INITIAL-COMPLETE' | 'VIRTUAL' | 'NATIVE';\n}\n\nexport async function createApplicationsWebhook(connectionId: string, myWebhookUrl: string) {\n    const result = await sdk.unified.createUnifiedWebhook({\n        webhook: {\n            hookUrl: myWebhookUrl,\n            objectType: ObjectType.AtsApplication,\n            event: Event.Updated,\n            connectionId,\n        },\n    });\n\n    return result.webhook;\n}\n\nexport async function handleUnifiedWebhook(incoming: IWebhookData\u003CAtsApplication>, trigger_status: AtsApplicationStatus) {\n    if (incoming.webhook.object_type !== 'ats_application') {\n        return; // not for us\n    }\n\n    const sig =\n                        createHmac('sha1', process.env.WORKSPACE_SECRET)\n                            .update(JSON.stringify(incoming.data))\n                            .update(String(incoming.nonce))\n                            .digest('base64');\n    if (sig !== incoming.sig) {\n        return; // Houston, we have a problem... with security\n    }\n\n    return incoming.data?.filter((application: AtsApplication) => application.status === trigger_status);\n}\n",[109,14671,14672,14686,14698,14711,14715,14729,14733,14741,14745,14749,14753,14762,14773,14784,14795,14806,14817,14828,14840,14851,14862,14873,14884,14896,14907,14918,14930,14942,14953,14957,14961,14977,14993,15007,15021,15035,15062,15066,15070,15100,15117,15122,15127,15132,15137,15141,15145,15150,15154,15161,15165,15169,15205,15221,15231,15235,15239,15249,15268,15287,15301,15314,15326,15335,15339,15343,15371],{"__ignoreMap":107},[112,14673,14674,14676,14679,14681,14684],{"class":114,"line":115},[112,14675,230],{"class":229},[112,14677,14678],{"class":236}," { createHmac } ",[112,14680,247],{"class":229},[112,14682,14683],{"class":122}," 'crypto'",[112,14685,237],{"class":236},[112,14687,14688,14690,14692,14694,14696],{"class":114,"line":126},[112,14689,230],{"class":229},[112,14691,244],{"class":236},[112,14693,247],{"class":229},[112,14695,250],{"class":122},[112,14697,237],{"class":236},[112,14699,14700,14702,14705,14707,14709],{"class":114,"line":135},[112,14701,230],{"class":229},[112,14703,14704],{"class":236}," { AtsApplication, AtsApplicationStatus, Event, ObjectType, WebhookType } ",[112,14706,247],{"class":229},[112,14708,14311],{"class":122},[112,14710,237],{"class":236},[112,14712,14713],{"class":114,"line":147},[112,14714,272],{"emptyLinePlaceholder":271},[112,14716,14717,14719,14721,14723,14725,14727],{"class":114,"line":202},[112,14718,277],{"class":229},[112,14720,351],{"class":129},[112,14722,354],{"class":229},[112,14724,357],{"class":229},[112,14726,360],{"class":118},[112,14728,363],{"class":236},[112,14730,14731],{"class":114,"line":208},[112,14732,12770],{"class":236},[112,14734,14735,14737,14739],{"class":114,"line":291},[112,14736,12775],{"class":236},[112,14738,12778],{"class":122},[112,14740,288],{"class":236},[112,14742,14743],{"class":114,"line":299},[112,14744,988],{"class":236},[112,14746,14747],{"class":114,"line":307},[112,14748,384],{"class":236},[112,14750,14751],{"class":114,"line":315},[112,14752,272],{"emptyLinePlaceholder":271},[112,14754,14755,14757,14760],{"class":114,"line":323},[112,14756,10296],{"class":229},[112,14758,14759],{"class":118}," IncomingWebhook",[112,14761,280],{"class":236},[112,14763,14764,14767,14769,14771],{"class":114,"line":329},[112,14765,14766],{"class":517},"    id",[112,14768,171],{"class":229},[112,14770,523],{"class":129},[112,14772,237],{"class":236},[112,14774,14775,14778,14780,14782],{"class":114,"line":341},[112,14776,14777],{"class":517},"    created_at",[112,14779,171],{"class":229},[112,14781,10330],{"class":118},[112,14783,237],{"class":236},[112,14785,14786,14789,14791,14793],{"class":114,"line":346},[112,14787,14788],{"class":517},"    updated_at",[112,14790,171],{"class":229},[112,14792,10330],{"class":118},[112,14794,237],{"class":236},[112,14796,14797,14800,14802,14804],{"class":114,"line":366},[112,14798,14799],{"class":517},"    workspace_id",[112,14801,171],{"class":229},[112,14803,523],{"class":129},[112,14805,237],{"class":236},[112,14807,14808,14811,14813,14815],{"class":114,"line":381},[112,14809,14810],{"class":517},"    connection_id",[112,14812,171],{"class":229},[112,14814,523],{"class":129},[112,14816,237],{"class":236},[112,14818,14819,14822,14824,14826],{"class":114,"line":387},[112,14820,14821],{"class":517},"    hook_url",[112,14823,171],{"class":229},[112,14825,523],{"class":129},[112,14827,237],{"class":236},[112,14829,14830,14833,14835,14838],{"class":114,"line":392},[112,14831,14832],{"class":517},"    object_type",[112,14834,171],{"class":229},[112,14836,14837],{"class":118}," TObjectType",[112,14839,237],{"class":236},[112,14841,14842,14845,14847,14849],{"class":114,"line":409},[112,14843,14844],{"class":517},"    interval",[112,14846,171],{"class":229},[112,14848,1054],{"class":129},[112,14850,237],{"class":236},[112,14852,14853,14856,14858,14860],{"class":114,"line":422},[112,14854,14855],{"class":517},"    checked_at",[112,14857,171],{"class":229},[112,14859,10330],{"class":118},[112,14861,237],{"class":236},[112,14863,14864,14867,14869,14871],{"class":114,"line":435},[112,14865,14866],{"class":517},"    integration_type",[112,14868,171],{"class":229},[112,14870,523],{"class":129},[112,14872,237],{"class":236},[112,14874,14875,14878,14880,14882],{"class":114,"line":440},[112,14876,14877],{"class":517},"    environment",[112,14879,171],{"class":229},[112,14881,523],{"class":129},[112,14883,237],{"class":236},[112,14885,14886,14889,14891,14894],{"class":114,"line":4949},[112,14887,14888],{"class":517},"    event",[112,14890,171],{"class":229},[112,14892,14893],{"class":118}," Event",[112,14895,237],{"class":236},[112,14897,14898,14901,14903,14905],{"class":114,"line":4960},[112,14899,14900],{"class":517},"    runs",[112,14902,171],{"class":229},[112,14904,523],{"class":129},[112,14906,10420],{"class":236},[112,14908,14909,14912,14914,14916],{"class":114,"line":4972},[112,14910,14911],{"class":517},"    fields",[112,14913,171],{"class":229},[112,14915,523],{"class":129},[112,14917,237],{"class":236},[112,14919,14920,14923,14925,14928],{"class":114,"line":4984},[112,14921,14922],{"class":517},"    webhook_type",[112,14924,171],{"class":229},[112,14926,14927],{"class":118}," WebhookType",[112,14929,237],{"class":236},[112,14931,14932,14935,14937,14940],{"class":114,"line":4992},[112,14933,14934],{"class":517},"    is_healthy",[112,14936,171],{"class":229},[112,14938,14939],{"class":129}," boolean",[112,14941,237],{"class":236},[112,14943,14944,14947,14949,14951],{"class":114,"line":5000},[112,14945,14946],{"class":517},"    page_max_limit",[112,14948,171],{"class":229},[112,14950,1054],{"class":129},[112,14952,237],{"class":236},[112,14954,14955],{"class":114,"line":5008},[112,14956,584],{"class":236},[112,14958,14959],{"class":114,"line":5016},[112,14960,272],{"emptyLinePlaceholder":271},[112,14962,14963,14965,14968,14971,14974],{"class":114,"line":5024},[112,14964,10296],{"class":229},[112,14966,14967],{"class":118}," IWebhookData",[112,14969,14970],{"class":236},"\u003C",[112,14972,14973],{"class":118},"T",[112,14975,14976],{"class":236},"> {\n",[112,14978,14979,14982,14984,14987,14990],{"class":114,"line":5032},[112,14980,14981],{"class":517},"    data",[112,14983,171],{"class":229},[112,14985,14986],{"class":118}," T",[112,14988,14989],{"class":236},"[]; ",[112,14991,14992],{"class":578},"// The data array will contact an array of specific objects according to the webhook's connection. (eg. CRM Contacts)\n",[112,14994,14995,14998,15000,15002,15004],{"class":114,"line":5040},[112,14996,14997],{"class":517},"    webhook",[112,14999,171],{"class":229},[112,15001,14759],{"class":118},[112,15003,10369],{"class":236},[112,15005,15006],{"class":578},"// The webhook object\n",[112,15008,15009,15012,15014,15016,15018],{"class":114,"line":5046},[112,15010,15011],{"class":517},"    nonce",[112,15013,171],{"class":229},[112,15015,523],{"class":129},[112,15017,10369],{"class":236},[112,15019,15020],{"class":578},"// random string\n",[112,15022,15023,15026,15028,15030,15032],{"class":114,"line":5052},[112,15024,15025],{"class":517},"    sig",[112,15027,171],{"class":229},[112,15029,523],{"class":129},[112,15031,10369],{"class":236},[112,15033,15034],{"class":578},"// HMAC-SHA1(workspace.secret, data + nonce)\n",[112,15036,15037,15040,15042,15045,15047,15050,15052,15055,15057,15060],{"class":114,"line":5061},[112,15038,15039],{"class":517},"    type",[112,15041,171],{"class":229},[112,15043,15044],{"class":122}," 'INITIAL-PARTIAL'",[112,15046,10327],{"class":229},[112,15048,15049],{"class":122}," 'INITIAL-COMPLETE'",[112,15051,10327],{"class":229},[112,15053,15054],{"class":122}," 'VIRTUAL'",[112,15056,10327],{"class":229},[112,15058,15059],{"class":122}," 'NATIVE'",[112,15061,237],{"class":236},[112,15063,15064],{"class":114,"line":5066},[112,15065,584],{"class":236},[112,15067,15068],{"class":114,"line":9217},[112,15069,272],{"emptyLinePlaceholder":271},[112,15071,15072,15074,15076,15078,15081,15083,15085,15087,15089,15091,15094,15096,15098],{"class":114,"line":9225},[112,15073,503],{"class":229},[112,15075,506],{"class":229},[112,15077,509],{"class":229},[112,15079,15080],{"class":118}," createApplicationsWebhook",[112,15082,456],{"class":236},[112,15084,518],{"class":517},[112,15086,171],{"class":229},[112,15088,523],{"class":129},[112,15090,1046],{"class":236},[112,15092,15093],{"class":517},"myWebhookUrl",[112,15095,171],{"class":229},[112,15097,523],{"class":129},[112,15099,526],{"class":236},[112,15101,15102,15104,15106,15108,15110,15112,15115],{"class":114,"line":9237},[112,15103,1435],{"class":229},[112,15105,911],{"class":129},[112,15107,354],{"class":229},[112,15109,539],{"class":229},[112,15111,12806],{"class":236},[112,15113,15114],{"class":118},"createUnifiedWebhook",[112,15116,363],{"class":236},[112,15118,15119],{"class":114,"line":9248},[112,15120,15121],{"class":236},"        webhook: {\n",[112,15123,15124],{"class":114,"line":9253},[112,15125,15126],{"class":236},"            hookUrl: myWebhookUrl,\n",[112,15128,15129],{"class":114,"line":9261},[112,15130,15131],{"class":236},"            objectType: ObjectType.AtsApplication,\n",[112,15133,15134],{"class":114,"line":9267},[112,15135,15136],{"class":236},"            event: Event.Updated,\n",[112,15138,15139],{"class":114,"line":9272},[112,15140,14510],{"class":236},[112,15142,15143],{"class":114,"line":9280},[112,15144,4803],{"class":236},[112,15146,15147],{"class":114,"line":9293},[112,15148,15149],{"class":236},"    });\n",[112,15151,15152],{"class":114,"line":9304},[112,15153,272],{"emptyLinePlaceholder":271},[112,15155,15156,15158],{"class":114,"line":9309},[112,15157,572],{"class":229},[112,15159,15160],{"class":236}," result.webhook;\n",[112,15162,15163],{"class":114,"line":9317},[112,15164,584],{"class":236},[112,15166,15167],{"class":114,"line":9328},[112,15168,272],{"emptyLinePlaceholder":271},[112,15170,15171,15173,15175,15177,15180,15182,15185,15187,15189,15191,15194,15197,15199,15201,15203],{"class":114,"line":9337},[112,15172,503],{"class":229},[112,15174,506],{"class":229},[112,15176,509],{"class":229},[112,15178,15179],{"class":118}," handleUnifiedWebhook",[112,15181,456],{"class":236},[112,15183,15184],{"class":517},"incoming",[112,15186,171],{"class":229},[112,15188,14967],{"class":118},[112,15190,14970],{"class":236},[112,15192,15193],{"class":118},"AtsApplication",[112,15195,15196],{"class":236},">, ",[112,15198,14379],{"class":517},[112,15200,171],{"class":229},[112,15202,14384],{"class":118},[112,15204,526],{"class":236},[112,15206,15207,15210,15213,15216,15219],{"class":114,"line":9342},[112,15208,15209],{"class":229},"    if",[112,15211,15212],{"class":236}," (incoming.webhook.object_type ",[112,15214,15215],{"class":229},"!==",[112,15217,15218],{"class":122}," 'ats_application'",[112,15220,526],{"class":236},[112,15222,15223,15226,15228],{"class":114,"line":9350},[112,15224,15225],{"class":229},"        return",[112,15227,10369],{"class":236},[112,15229,15230],{"class":578},"// not for us\n",[112,15232,15233],{"class":114,"line":9361},[112,15234,3946],{"class":236},[112,15236,15237],{"class":114,"line":9371},[112,15238,272],{"emptyLinePlaceholder":271},[112,15240,15241,15243,15246],{"class":114,"line":9376},[112,15242,1435],{"class":229},[112,15244,15245],{"class":129}," sig",[112,15247,15248],{"class":229}," =\n",[112,15250,15251,15254,15256,15259,15262,15265],{"class":114,"line":9384},[112,15252,15253],{"class":118},"                        createHmac",[112,15255,456],{"class":236},[112,15257,15258],{"class":122},"'sha1'",[112,15260,15261],{"class":236},", process.env.",[112,15263,15264],{"class":129},"WORKSPACE_SECRET",[112,15266,15267],{"class":236},")\n",[112,15269,15270,15273,15276,15278,15280,15282,15284],{"class":114,"line":9396},[112,15271,15272],{"class":236},"                            .",[112,15274,15275],{"class":118},"update",[112,15277,456],{"class":236},[112,15279,13765],{"class":129},[112,15281,634],{"class":236},[112,15283,13770],{"class":118},[112,15285,15286],{"class":236},"(incoming.data))\n",[112,15288,15289,15291,15293,15295,15298],{"class":114,"line":9405},[112,15290,15272],{"class":236},[112,15292,15275],{"class":118},[112,15294,456],{"class":236},[112,15296,15297],{"class":118},"String",[112,15299,15300],{"class":236},"(incoming.nonce))\n",[112,15302,15303,15305,15308,15310,15312],{"class":114,"line":9410},[112,15304,15272],{"class":236},[112,15306,15307],{"class":118},"digest",[112,15309,456],{"class":236},[112,15311,13781],{"class":122},[112,15313,464],{"class":236},[112,15315,15316,15318,15321,15323],{"class":114,"line":9422},[112,15317,15209],{"class":229},[112,15319,15320],{"class":236}," (sig ",[112,15322,15215],{"class":229},[112,15324,15325],{"class":236}," incoming.sig) {\n",[112,15327,15328,15330,15332],{"class":114,"line":9434},[112,15329,15225],{"class":229},[112,15331,10369],{"class":236},[112,15333,15334],{"class":578},"// Houston, we have a problem... with security\n",[112,15336,15337],{"class":114,"line":9447},[112,15338,3946],{"class":236},[112,15340,15341],{"class":114,"line":9459},[112,15342,272],{"emptyLinePlaceholder":271},[112,15344,15345,15347,15350,15352,15354,15356,15358,15360,15362,15364,15366,15368],{"class":114,"line":9472},[112,15346,572],{"class":229},[112,15348,15349],{"class":236}," incoming.data?.",[112,15351,14558],{"class":118},[112,15353,735],{"class":236},[112,15355,14563],{"class":517},[112,15357,171],{"class":229},[112,15359,14416],{"class":118},[112,15361,745],{"class":236},[112,15363,748],{"class":229},[112,15365,14570],{"class":236},[112,15367,14573],{"class":229},[112,15369,15370],{"class":236}," trigger_status);\n",[112,15372,15373],{"class":114,"line":9485},[112,15374,584],{"class":236},[46,15376,15377,15378,15382],{},"Alternatively, create a polling schedule to ",[1614,15379,15381],{"href":14280,"rel":15380},[1618],"get new/updated applications",", which would be similar to the code in 1a)",[46,15384,15385,15388],{},[478,15386,15387],{},"Filter applications on a specific status",[43,15389,15390,15400],{},[46,15391,2288,15392,15396,15397,15399],{},[1614,15393,14563],{"href":15394,"rel":15395},"https://docs.unified.to/ats/application/model",[1618]," has a standardized ",[109,15398,11487],{}," across all ATS integrations, so decide which one makes sense for you to trigger the assessment",[46,15401,15402,15403,2251,15406,2251,15409,2251,15412,2251,15415,2251,15418,2251,15421,2251,15424,2251,15427,2251,15430,2251,15433,2251,15436,2251,15439,15442,15443,1046,15445,1046,15447,1046,15449,15451,15452,15454],{},"Application.Status options are ",[109,15404,15405],{},"NEW",[109,15407,15408],{},"REVIEWING",[109,15410,15411],{},"SCREENING",[109,15413,15414],{},"SUBMITTED",[109,15416,15417],{},"FIRST_INTERVIEW",[109,15419,15420],{},"SECOND_INTERVIEW",[109,15422,15423],{},"THIRD_INTERVIEW",[109,15425,15426],{},"BACKGROUND_CHECK",[109,15428,15429],{},"OFFERED",[109,15431,15432],{},"ACCEPTED",[109,15434,15435],{},"HIRED",[109,15437,15438],{},"REJECTED",[109,15440,15441],{},"WITHDRAWN",". Of these, ",[109,15444,15408],{},[109,15446,15411],{},[109,15448,15417],{},[109,15450,15420],{},", or ",[109,15453,15426],{}," should be considered.",[46,15456,15457,15460],{},[478,15458,15459],{},"Email the candidate with the assessment based on the job",[43,15461,15462,15594,15723],{},[46,15463,15464,15469,15470,15473,15474],{},[1614,15465,15468],{"href":15466,"rel":15467},"https://docs.unified.to/ats/candidate/Retrieve_a_candidate",[1618],"Read the candidate"," from the ",[109,15471,15472],{},"Application.candidate_id"," field",[102,15475,15477],{"className":220,"code":15476,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function readCandidate(connectionId: string, candidateId: string) {\n    return await sdk.ats.getAtsCandidate({\n        id: candidateId,\n        connectionId,\n    });\n}\n",[109,15478,15479,15491,15495,15509,15513,15521,15525,15529,15533,15563,15576,15581,15586,15590],{"__ignoreMap":107},[112,15480,15481,15483,15485,15487,15489],{"class":114,"line":115},[112,15482,230],{"class":229},[112,15484,244],{"class":236},[112,15486,247],{"class":229},[112,15488,250],{"class":122},[112,15490,237],{"class":236},[112,15492,15493],{"class":114,"line":126},[112,15494,272],{"emptyLinePlaceholder":271},[112,15496,15497,15499,15501,15503,15505,15507],{"class":114,"line":135},[112,15498,277],{"class":229},[112,15500,351],{"class":129},[112,15502,354],{"class":229},[112,15504,357],{"class":229},[112,15506,360],{"class":118},[112,15508,363],{"class":236},[112,15510,15511],{"class":114,"line":147},[112,15512,12770],{"class":236},[112,15514,15515,15517,15519],{"class":114,"line":202},[112,15516,12775],{"class":236},[112,15518,12778],{"class":122},[112,15520,288],{"class":236},[112,15522,15523],{"class":114,"line":208},[112,15524,988],{"class":236},[112,15526,15527],{"class":114,"line":291},[112,15528,384],{"class":236},[112,15530,15531],{"class":114,"line":299},[112,15532,272],{"emptyLinePlaceholder":271},[112,15534,15535,15537,15539,15541,15544,15546,15548,15550,15552,15554,15557,15559,15561],{"class":114,"line":307},[112,15536,503],{"class":229},[112,15538,506],{"class":229},[112,15540,509],{"class":229},[112,15542,15543],{"class":118}," readCandidate",[112,15545,456],{"class":236},[112,15547,518],{"class":517},[112,15549,171],{"class":229},[112,15551,523],{"class":129},[112,15553,1046],{"class":236},[112,15555,15556],{"class":517},"candidateId",[112,15558,171],{"class":229},[112,15560,523],{"class":129},[112,15562,526],{"class":236},[112,15564,15565,15567,15569,15571,15574],{"class":114,"line":315},[112,15566,572],{"class":229},[112,15568,539],{"class":229},[112,15570,542],{"class":236},[112,15572,15573],{"class":118},"getAtsCandidate",[112,15575,363],{"class":236},[112,15577,15578],{"class":114,"line":323},[112,15579,15580],{"class":236},"        id: candidateId,\n",[112,15582,15583],{"class":114,"line":329},[112,15584,15585],{"class":236},"        connectionId,\n",[112,15587,15588],{"class":114,"line":341},[112,15589,15149],{"class":236},[112,15591,15592],{"class":114,"line":346},[112,15593,584],{"class":236},[46,15595,15596,15597,15469,15602,15473,15605],{},"Optional: ",[1614,15598,15601],{"href":15599,"rel":15600},"https://docs.unified.to/ats/job/Retrieve_a_job",[1618],"read the job",[109,15603,15604],{},"Application.job_id",[102,15606,15608],{"className":220,"code":15607,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function readJob(connectionId: string, jobId: string) {\n    return await sdk.ats.getAtsJob({\n        id: jobId,\n        connectionId,\n    });\n}\n",[109,15609,15610,15622,15626,15640,15644,15652,15656,15660,15664,15693,15706,15711,15715,15719],{"__ignoreMap":107},[112,15611,15612,15614,15616,15618,15620],{"class":114,"line":115},[112,15613,230],{"class":229},[112,15615,244],{"class":236},[112,15617,247],{"class":229},[112,15619,250],{"class":122},[112,15621,237],{"class":236},[112,15623,15624],{"class":114,"line":126},[112,15625,272],{"emptyLinePlaceholder":271},[112,15627,15628,15630,15632,15634,15636,15638],{"class":114,"line":135},[112,15629,277],{"class":229},[112,15631,351],{"class":129},[112,15633,354],{"class":229},[112,15635,357],{"class":229},[112,15637,360],{"class":118},[112,15639,363],{"class":236},[112,15641,15642],{"class":114,"line":147},[112,15643,12770],{"class":236},[112,15645,15646,15648,15650],{"class":114,"line":202},[112,15647,12775],{"class":236},[112,15649,12778],{"class":122},[112,15651,288],{"class":236},[112,15653,15654],{"class":114,"line":208},[112,15655,988],{"class":236},[112,15657,15658],{"class":114,"line":291},[112,15659,384],{"class":236},[112,15661,15662],{"class":114,"line":299},[112,15663,272],{"emptyLinePlaceholder":271},[112,15665,15666,15668,15670,15672,15675,15677,15679,15681,15683,15685,15687,15689,15691],{"class":114,"line":307},[112,15667,503],{"class":229},[112,15669,506],{"class":229},[112,15671,509],{"class":229},[112,15673,15674],{"class":118}," readJob",[112,15676,456],{"class":236},[112,15678,518],{"class":517},[112,15680,171],{"class":229},[112,15682,523],{"class":129},[112,15684,1046],{"class":236},[112,15686,14389],{"class":517},[112,15688,171],{"class":229},[112,15690,523],{"class":129},[112,15692,526],{"class":236},[112,15694,15695,15697,15699,15701,15704],{"class":114,"line":315},[112,15696,572],{"class":229},[112,15698,539],{"class":229},[112,15700,542],{"class":236},[112,15702,15703],{"class":118},"getAtsJob",[112,15705,363],{"class":236},[112,15707,15708],{"class":114,"line":323},[112,15709,15710],{"class":236},"        id: jobId,\n",[112,15712,15713],{"class":114,"line":329},[112,15714,15585],{"class":236},[112,15716,15717],{"class":114,"line":341},[112,15718,15149],{"class":236},[112,15720,15721],{"class":114,"line":346},[112,15722,584],{"class":236},[46,15724,15725,15726,1046,15733,9571,15736,15739],{},"Determine which test to send to the candidate based on the ",[1614,15727,15730],{"href":15728,"rel":15729},"https://job.id/",[1618],[109,15731,15732],{},"Job.id",[109,15734,15735],{},"Job.descripton",[109,15737,15738],{},"Job.name"," fields",[46,15741,15742,15745],{},[478,15743,15744],{},"Once the candidate has completed the assessment/test, notify the hiring manager and/or recruiter",[43,15746,15747,15886,16077,16085],{},[46,15748,15749,15753,15754,15757,15758,15761,15762,15765,15766],{},[1614,15750,15752],{"href":12849,"rel":15751},[1618],"Read the employee"," information based on the ",[109,15755,15756],{},"Job.hiring_managers_ids"," and/or ",[109,15759,15760],{},"Job.recruiter_ids"," fields and use the ",[109,15763,15764],{},"Employee.emails"," field to email them the notification",[102,15767,15769],{"className":220,"code":15768,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function readEmployee(connectionId: string, employeeId: string) {\n    return await sdk.hris.getHrisEmployee({\n        id: employeeId,\n        connectionId,\n    });\n}\n",[109,15770,15771,15783,15787,15801,15805,15813,15817,15821,15825,15855,15869,15874,15878,15882],{"__ignoreMap":107},[112,15772,15773,15775,15777,15779,15781],{"class":114,"line":115},[112,15774,230],{"class":229},[112,15776,244],{"class":236},[112,15778,247],{"class":229},[112,15780,250],{"class":122},[112,15782,237],{"class":236},[112,15784,15785],{"class":114,"line":126},[112,15786,272],{"emptyLinePlaceholder":271},[112,15788,15789,15791,15793,15795,15797,15799],{"class":114,"line":135},[112,15790,277],{"class":229},[112,15792,351],{"class":129},[112,15794,354],{"class":229},[112,15796,357],{"class":229},[112,15798,360],{"class":118},[112,15800,363],{"class":236},[112,15802,15803],{"class":114,"line":147},[112,15804,12770],{"class":236},[112,15806,15807,15809,15811],{"class":114,"line":202},[112,15808,12775],{"class":236},[112,15810,12778],{"class":122},[112,15812,288],{"class":236},[112,15814,15815],{"class":114,"line":208},[112,15816,988],{"class":236},[112,15818,15819],{"class":114,"line":291},[112,15820,384],{"class":236},[112,15822,15823],{"class":114,"line":299},[112,15824,272],{"emptyLinePlaceholder":271},[112,15826,15827,15829,15831,15833,15836,15838,15840,15842,15844,15846,15849,15851,15853],{"class":114,"line":307},[112,15828,503],{"class":229},[112,15830,506],{"class":229},[112,15832,509],{"class":229},[112,15834,15835],{"class":118}," readEmployee",[112,15837,456],{"class":236},[112,15839,518],{"class":517},[112,15841,171],{"class":229},[112,15843,523],{"class":129},[112,15845,1046],{"class":236},[112,15847,15848],{"class":517},"employeeId",[112,15850,171],{"class":229},[112,15852,523],{"class":129},[112,15854,526],{"class":236},[112,15856,15857,15859,15861,15864,15867],{"class":114,"line":315},[112,15858,572],{"class":229},[112,15860,539],{"class":229},[112,15862,15863],{"class":236}," sdk.hris.",[112,15865,15866],{"class":118},"getHrisEmployee",[112,15868,363],{"class":236},[112,15870,15871],{"class":114,"line":323},[112,15872,15873],{"class":236},"        id: employeeId,\n",[112,15875,15876],{"class":114,"line":329},[112,15877,15585],{"class":236},[112,15879,15880],{"class":114,"line":341},[112,15881,15149],{"class":236},[112,15883,15884],{"class":114,"line":346},[112,15885,584],{"class":236},[46,15887,15596,15888,15893,15894],{},[1614,15889,15892],{"href":15890,"rel":15891},"https://docs.unified.to/ats/document/Create_a_document",[1618],"push back a PDF document"," into the customer's ATS that is associated with that application",[102,15895,15897],{"className":220,"code":15896,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AtsDocumentType } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function createDocument(connectionId: string, applicationId: string, documentUrl: string, filename: string, type: AtsDocumentType) {\n    return await sdk.ats.createAtsDocument({\n        atsDocument: {\n            applicationId,\n            type,\n            documentUrl,\n            filename,\n        },\n        connectionId,\n    });\n}\n",[109,15898,15899,15911,15924,15928,15942,15946,15954,15958,15962,15966,16023,16036,16041,16046,16051,16056,16061,16065,16069,16073],{"__ignoreMap":107},[112,15900,15901,15903,15905,15907,15909],{"class":114,"line":115},[112,15902,230],{"class":229},[112,15904,244],{"class":236},[112,15906,247],{"class":229},[112,15908,250],{"class":122},[112,15910,237],{"class":236},[112,15912,15913,15915,15918,15920,15922],{"class":114,"line":126},[112,15914,230],{"class":229},[112,15916,15917],{"class":236}," { AtsDocumentType } ",[112,15919,247],{"class":229},[112,15921,14311],{"class":122},[112,15923,237],{"class":236},[112,15925,15926],{"class":114,"line":135},[112,15927,272],{"emptyLinePlaceholder":271},[112,15929,15930,15932,15934,15936,15938,15940],{"class":114,"line":147},[112,15931,277],{"class":229},[112,15933,351],{"class":129},[112,15935,354],{"class":229},[112,15937,357],{"class":229},[112,15939,360],{"class":118},[112,15941,363],{"class":236},[112,15943,15944],{"class":114,"line":202},[112,15945,12770],{"class":236},[112,15947,15948,15950,15952],{"class":114,"line":208},[112,15949,12775],{"class":236},[112,15951,12778],{"class":122},[112,15953,288],{"class":236},[112,15955,15956],{"class":114,"line":291},[112,15957,988],{"class":236},[112,15959,15960],{"class":114,"line":299},[112,15961,384],{"class":236},[112,15963,15964],{"class":114,"line":307},[112,15965,272],{"emptyLinePlaceholder":271},[112,15967,15968,15970,15972,15974,15977,15979,15981,15983,15985,15987,15990,15992,15994,15996,15999,16001,16003,16005,16008,16010,16012,16014,16016,16018,16021],{"class":114,"line":315},[112,15969,503],{"class":229},[112,15971,506],{"class":229},[112,15973,509],{"class":229},[112,15975,15976],{"class":118}," createDocument",[112,15978,456],{"class":236},[112,15980,518],{"class":517},[112,15982,171],{"class":229},[112,15984,523],{"class":129},[112,15986,1046],{"class":236},[112,15988,15989],{"class":517},"applicationId",[112,15991,171],{"class":229},[112,15993,523],{"class":129},[112,15995,1046],{"class":236},[112,15997,15998],{"class":517},"documentUrl",[112,16000,171],{"class":229},[112,16002,523],{"class":129},[112,16004,1046],{"class":236},[112,16006,16007],{"class":517},"filename",[112,16009,171],{"class":229},[112,16011,523],{"class":129},[112,16013,1046],{"class":236},[112,16015,2472],{"class":517},[112,16017,171],{"class":229},[112,16019,16020],{"class":118}," AtsDocumentType",[112,16022,526],{"class":236},[112,16024,16025,16027,16029,16031,16034],{"class":114,"line":323},[112,16026,572],{"class":229},[112,16028,539],{"class":229},[112,16030,542],{"class":236},[112,16032,16033],{"class":118},"createAtsDocument",[112,16035,363],{"class":236},[112,16037,16038],{"class":114,"line":329},[112,16039,16040],{"class":236},"        atsDocument: {\n",[112,16042,16043],{"class":114,"line":341},[112,16044,16045],{"class":236},"            applicationId,\n",[112,16047,16048],{"class":114,"line":346},[112,16049,16050],{"class":236},"            type,\n",[112,16052,16053],{"class":114,"line":366},[112,16054,16055],{"class":236},"            documentUrl,\n",[112,16057,16058],{"class":114,"line":381},[112,16059,16060],{"class":236},"            filename,\n",[112,16062,16063],{"class":114,"line":387},[112,16064,4803],{"class":236},[112,16066,16067],{"class":114,"line":392},[112,16068,15585],{"class":236},[112,16070,16071],{"class":114,"line":409},[112,16072,15149],{"class":236},[112,16074,16075],{"class":114,"line":422},[112,16076,584],{"class":236},[46,16078,15596,16079,16084],{},[1614,16080,16083],{"href":16081,"rel":16082},"https://docs.unified.to/ats/activity/Create_an_activity",[1618],"create an activity"," associated with the application or candidate",[46,16086,15596,16087,16092,16093,16096],{},[1614,16088,16091],{"href":16089,"rel":16090},"https://docs.unified.to/ats/candidate/Update_a_candidate",[1618],"update a candidate"," with certain ",[109,16094,16095],{},"tags",[102,16097,16099],{"className":220,"code":16098,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function updateCandidateTags(connectionId: string, candidateId: string, tags: string[]) {\n    return await sdk.ats.updateAtsCandidate({\n        atsCandidate: {\n            tags,\n        },\n        id: candidateId,\n        connectionId,\n    });\n}\n",[109,16100,16101,16113,16117,16131,16135,16143,16147,16151,16155,16192,16205,16210,16215,16219,16223,16227,16231],{"__ignoreMap":107},[112,16102,16103,16105,16107,16109,16111],{"class":114,"line":115},[112,16104,230],{"class":229},[112,16106,244],{"class":236},[112,16108,247],{"class":229},[112,16110,250],{"class":122},[112,16112,237],{"class":236},[112,16114,16115],{"class":114,"line":126},[112,16116,272],{"emptyLinePlaceholder":271},[112,16118,16119,16121,16123,16125,16127,16129],{"class":114,"line":135},[112,16120,277],{"class":229},[112,16122,351],{"class":129},[112,16124,354],{"class":229},[112,16126,357],{"class":229},[112,16128,360],{"class":118},[112,16130,363],{"class":236},[112,16132,16133],{"class":114,"line":147},[112,16134,12770],{"class":236},[112,16136,16137,16139,16141],{"class":114,"line":202},[112,16138,12775],{"class":236},[112,16140,12778],{"class":122},[112,16142,288],{"class":236},[112,16144,16145],{"class":114,"line":208},[112,16146,988],{"class":236},[112,16148,16149],{"class":114,"line":291},[112,16150,384],{"class":236},[112,16152,16153],{"class":114,"line":299},[112,16154,272],{"emptyLinePlaceholder":271},[112,16156,16157,16159,16161,16163,16166,16168,16170,16172,16174,16176,16178,16180,16182,16184,16186,16188,16190],{"class":114,"line":307},[112,16158,503],{"class":229},[112,16160,506],{"class":229},[112,16162,509],{"class":229},[112,16164,16165],{"class":118}," updateCandidateTags",[112,16167,456],{"class":236},[112,16169,518],{"class":517},[112,16171,171],{"class":229},[112,16173,523],{"class":129},[112,16175,1046],{"class":236},[112,16177,15556],{"class":517},[112,16179,171],{"class":229},[112,16181,523],{"class":129},[112,16183,1046],{"class":236},[112,16185,16095],{"class":517},[112,16187,171],{"class":229},[112,16189,523],{"class":129},[112,16191,1057],{"class":236},[112,16193,16194,16196,16198,16200,16203],{"class":114,"line":315},[112,16195,572],{"class":229},[112,16197,539],{"class":229},[112,16199,542],{"class":236},[112,16201,16202],{"class":118},"updateAtsCandidate",[112,16204,363],{"class":236},[112,16206,16207],{"class":114,"line":323},[112,16208,16209],{"class":236},"        atsCandidate: {\n",[112,16211,16212],{"class":114,"line":329},[112,16213,16214],{"class":236},"            tags,\n",[112,16216,16217],{"class":114,"line":341},[112,16218,4803],{"class":236},[112,16220,16221],{"class":114,"line":346},[112,16222,15580],{"class":236},[112,16224,16225],{"class":114,"line":366},[112,16226,15585],{"class":236},[112,16228,16229],{"class":114,"line":381},[112,16230,15149],{"class":236},[112,16232,16233],{"class":114,"line":387},[112,16234,584],{"class":236},[35,16236,16238],{"id":16237},"advanced-adding-rag-based-resume-matching","Advanced: Adding RAG-Based Resume Matching",[19,16240,16241],{},"Beyond triggering assessments, you can extend this workflow into a RAG architecture:",[43,16243,16244,16251,16254,16265],{},[46,16245,16246,16247,16250],{},"Retrieve the candidate's resume (",[109,16248,16249],{},"AtsCandidate.resume_url",") and job description.",[46,16252,16253],{},"Chunk and embed both documents.",[46,16255,16256,16257,1046,16259,14246,16262,634],{},"Store embeddings in your vector database with identifiers like ",[109,16258,2886],{},[109,16260,16261],{},"candidate_id",[109,16263,16264],{},"job_id",[46,16266,16267],{},"Retrieve the most relevant resume segments against the job description before generating screening insights or ranking scores.",[19,16269,16270],{},"Unified handles ingestion and normalization across ATS providers; embeddings and retrieval remain in your infrastructure.",[67,16272,16274],{"id":16273},"keep-learning","Keep learning:",[72,16276,16277,16283,16290],{},[46,16278,16279],{},[1614,16280,16282],{"href":12388,"rel":16281},[1618],"How to add a test connection ",[46,16284,16285],{},[1614,16286,16289],{"href":16287,"rel":16288},"https://unified.to/blog/start_here_how_your_customer_can_add_an_integration_in_your_application",[1618],"How your customers add integrations from your application",[46,16291,16292],{},[1614,16293,16296],{"href":16294,"rel":16295},"https://unified.to/blog/start_here_how_to_generate_oauth2_credentials",[1618],"How to generate OAuth 2 credentials ",[67,16298,16300],{"id":16299},"a-unified-api-to-integrate-them-all","A unified API to integrate them all",[19,16302,16303,16304,16309,16310,16316,16317,16324],{},"Unified.to is a complete solution to streamline your integration development process and power your Candidate Assessment product with critical third-party candidate data. You're reading this article on the ",[1614,16305,16307],{"href":1638,"rel":16306},[1618],[478,16308,1640],{}," blog. We're a Unified API developer platform for SaaS customer-facing integrations. We're excited to continue to innovate at Unified.to and solve hard, critical integration-related problems for our customers. If you're curious about our integrations-as-a-service solution, consider ",[1614,16311,16313],{"href":12214,"rel":16312},[1618],[478,16314,16315],{},"signing up for a free account"," or ",[1614,16318,16321],{"href":16319,"rel":16320},"https://calendly.com/michelle-unified/discovery-via-blog",[1618],[478,16322,16323],{},"meet with an integrations expert",[478,16325,634],{},[1558,16327,16328],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":107,"searchDepth":126,"depth":126,"links":16330},[16331,16332,16333,16334,16337,16338],{"id":14195,"depth":126,"text":14196},{"id":14206,"depth":126,"text":14207},{"id":14221,"depth":126,"text":14222},{"id":14254,"depth":126,"text":14255,"children":16335},[16336],{"id":16237,"depth":135,"text":16238},{"id":16273,"depth":126,"text":16274},{"id":16299,"depth":126,"text":16300},"There are two different ways that you can build a candidate assessment solution. Some ATS providers will allow for an assessment solution to register with them...",{"img":16341,"date":16342,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_assessment_product_with_unified-icon.png","2023-10-23T00:00:00.000Z","/guides/how_to_build_a_candidate_assessment_product_with_unified",{"title":14161,"description":16339},"guides/how_to_build_a_candidate_assessment_product_with_unified","fTTy2fKk-3exQcjd09iA_pEzCp0spQ7fRCNeqjMsH9g",{"id":16348,"title":16349,"body":16350,"description":16982,"extension":1576,"meta":16983,"navigation":271,"path":16986,"seo":16987,"stem":16988,"__hash__":16989},"guides/guides/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified.md","How to build a candidate sourcing or job board app with Unified.to",{"type":9,"value":16351,"toc":16971},[16352,16355,16357,16362,16366,16369,16372,16375,16377,16388,16393,16404,16406,16409,16417,16420,16424,16427,16433,16444,16550,16557,16580,16585,16588,16592,16595,16625,16872,16876,16885,16895,16909,16913,16924,16928,16936,16940,16968],[12,16353,16349],{"id":16354},"how-to-build-a-candidate-sourcing-or-job-board-app-with-unifiedto",[16,16356],{},[19,16358,16359],{},[22,16360,16361],{},"January 4, 2024",[67,16363,16365],{"id":16364},"why-build-with-a-unified-api","Why build with a unified API?",[19,16367,16368],{},"API integrations are necessary for any modern SaaS app, especially for recruitment solutions like candidate sourcing and job boards that require a high volume of integrations to improve product value and support a broader user base.",[19,16370,16371],{},"Instead of spending months or years developing ATS integrations individually, developers can leverage a unified API to integrate once to launch multiple integrations simultaneously. Unified APIs simplify integration efforts by offering consistent endpoints and data formats that reduce the complexity of managing numerous APIs.",[19,16373,16374],{},"Unified APIs accelerate development cycles, enabling quicker deployment of new features and product updates for your recruitment software. We built Unified.to to make integration development as easy as possible for SaaS developers.",[67,16376,70],{"id":69},[19,16378,16379,16380,16383,16384,16387],{},"Before starting, be sure to review our ",[1614,16381,14265],{"href":14263,"rel":16382},[1618]," article. It will walk you through registering for a free account and our onboarding. Once you have completed the onboarding steps, go ahead and ",[12408,16385],{"width":12410,"height":12411,"src":16386,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},"https://www.youtube.com/embed/T5Caf7ASTCA"," as you like.",[19,16389,16390],{},[1603,16391],{"alt":11593,"src":16392},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified-0.png",[19,16394,16395,16396,16399,16400,16403],{},"Next, deploy the ",[1614,16397,1640],{"href":1638,"rel":16398},[1618]," Embedded Authorization widget in your product's user-interface.  Check out our ",[12408,16401],{"width":12410,"height":12411,"src":16402,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},"https://www.youtube.com/embed/BqbzTPg6yi0"," to learn more.",[67,16405,9690],{"id":9689},[19,16407,16408],{},"These are main steps that you will need to support to build your candidate sourcing or job board app:",[43,16410,16411,16414],{},[46,16412,16413],{},"read active jobs to search relevant candidates for",[46,16415,16416],{},"apply a candidate to a job",[19,16418,16419],{},"Let's go into more detail for each.",[67,16421,16423],{"id":16422},"step-1-read-jobs","Step 1: Read Jobs",[19,16425,16426],{},"Before searching or finding relevant candidates, you'll need to know which jobs your customer wants you to search for.",[19,16428,16429,16432],{},[1614,16430,1640],{"href":1638,"rel":16431},[1618]," can help your app seamlessly import jobs from your customer's ATS.",[19,16434,16435,16436,2251,16439,634],{},"To get a list of existing jobs from your end user's ATS, simply call the ",[109,16437,16438],{},"listJobs",[1614,16440,16443],{"href":16441,"rel":16442},"https://docs.unified.to/ats/job/List_all_jobs",[1618],"API endpoint",[102,16445,16447],{"className":220,"code":16446,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: \"\u003CYOUR_API_KEY_HERE>\",\n    },\n});\n\nexport async function getJobs(connectionId: string) {\n    return await sdk.ats.listAtsJobs({\n        connectionId,\n    });\n}\n",[109,16448,16449,16461,16465,16479,16483,16492,16496,16500,16504,16525,16538,16542,16546],{"__ignoreMap":107},[112,16450,16451,16453,16455,16457,16459],{"class":114,"line":115},[112,16452,230],{"class":229},[112,16454,244],{"class":236},[112,16456,247],{"class":229},[112,16458,250],{"class":122},[112,16460,237],{"class":236},[112,16462,16463],{"class":114,"line":126},[112,16464,272],{"emptyLinePlaceholder":271},[112,16466,16467,16469,16471,16473,16475,16477],{"class":114,"line":135},[112,16468,277],{"class":229},[112,16470,351],{"class":129},[112,16472,354],{"class":229},[112,16474,357],{"class":229},[112,16476,360],{"class":118},[112,16478,363],{"class":236},[112,16480,16481],{"class":114,"line":147},[112,16482,12770],{"class":236},[112,16484,16485,16487,16490],{"class":114,"line":202},[112,16486,12775],{"class":236},[112,16488,16489],{"class":122},"\"\u003CYOUR_API_KEY_HERE>\"",[112,16491,288],{"class":236},[112,16493,16494],{"class":114,"line":208},[112,16495,988],{"class":236},[112,16497,16498],{"class":114,"line":291},[112,16499,384],{"class":236},[112,16501,16502],{"class":114,"line":299},[112,16503,272],{"emptyLinePlaceholder":271},[112,16505,16506,16508,16510,16512,16515,16517,16519,16521,16523],{"class":114,"line":307},[112,16507,503],{"class":229},[112,16509,506],{"class":229},[112,16511,509],{"class":229},[112,16513,16514],{"class":118}," getJobs",[112,16516,456],{"class":236},[112,16518,518],{"class":517},[112,16520,171],{"class":229},[112,16522,523],{"class":129},[112,16524,526],{"class":236},[112,16526,16527,16529,16531,16533,16536],{"class":114,"line":315},[112,16528,572],{"class":229},[112,16530,539],{"class":229},[112,16532,542],{"class":236},[112,16534,16535],{"class":118},"listAtsJobs",[112,16537,363],{"class":236},[112,16539,16540],{"class":114,"line":323},[112,16541,15585],{"class":236},[112,16543,16544],{"class":114,"line":329},[112,16545,15149],{"class":236},[112,16547,16548],{"class":114,"line":341},[112,16549,584],{"class":236},[19,16551,16552,16553,16556],{},"The connection_id comes in from your end user's authorization of their ATS and is stored on your end. You can watch our ",[12408,16554],{"width":12410,"height":12411,"src":16555,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},"https://www.youtube.com/embed/sd9Efb4i9N0"," for more detail.",[19,16558,9638,16559,16561,16562,16564,16565,1046,16568,14246,16571,16574,16575,16579],{},[109,16560,13026],{}," will have specific fields such as ",[109,16563,637],{}," , ",[109,16566,16567],{},"description",[109,16569,16570],{},"compensation",[109,16572,16573],{},"location"," that will be relevant to your software. Reference our ",[1614,16576,16578],{"href":13024,"rel":16577},[1618],"API docs"," for more information.",[19,16581,16582],{},[1603,16583],{"alt":11593,"src":16584},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified-1.png",[19,16586,16587],{},"Once you have the list of jobs, ask your customer to identify which jobs your app should identify candidates for.",[67,16589,16591],{"id":16590},"step-2-create-an-application","Step 2: Create an application",[19,16593,16594],{},"Once you have a candidate, there are two ways to create a job application.",[43,16596,16597,16607],{},[46,16598,16599,16600,16602,16603,16606],{},"Send the interested candidate to the job's public web page to apply directly. Most ",[109,16601,13026],{}," objects will have a ",[109,16604,16605],{},"public_job_url"," field that contains a list of URLs. The downside to this method is that you lose control of the candidate's experience and not all ATS providers supply the public website. The upside of this method is that it is very easy to implement.",[46,16608,16609,16610,2251,16613,16617,16618,2251,16621,634],{},"Create an application and candidate in the ATS directly using our Unified ATS API. This is easily accomplished by using the ",[109,16611,16612],{},"createCandidate",[1614,16614,16443],{"href":16615,"rel":16616},"https://docs.unified.to/ats/candidate/Create_a_candidate",[1618]," and  ",[109,16619,16620],{},"createApplication",[1614,16622,16443],{"href":16623,"rel":16624},"https://docs.unified.to/ats/application/Create_an_application",[1618],[102,16626,16628],{"className":220,"code":16627,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AtsCandidate } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function createCandidate(connectionId: string, atsCandidate: AtsCandidate) {\n    const result = await sdk.ats.createAtsCandidate({\n        atsCandidate,\n        connectionId,\n    });\n\n    return result.atsCandidate?.id;\n}\n\nexport async function createApplication(connectionId: string, candidateId: string, jobId: string) {\n    const result = await sdk.ats.createAtsApplication({\n        atsApplication: {\n            candidateId,\n            jobId,\n        },\n        connectionId,\n    });\n\n    return result.atsApplication?.id;\n}\n",[109,16629,16630,16642,16655,16659,16673,16677,16685,16689,16693,16697,16728,16745,16750,16754,16758,16762,16769,16773,16777,16814,16831,16836,16841,16845,16849,16853,16857,16861,16868],{"__ignoreMap":107},[112,16631,16632,16634,16636,16638,16640],{"class":114,"line":115},[112,16633,230],{"class":229},[112,16635,244],{"class":236},[112,16637,247],{"class":229},[112,16639,250],{"class":122},[112,16641,237],{"class":236},[112,16643,16644,16646,16649,16651,16653],{"class":114,"line":126},[112,16645,230],{"class":229},[112,16647,16648],{"class":236}," { AtsCandidate } ",[112,16650,247],{"class":229},[112,16652,14311],{"class":122},[112,16654,237],{"class":236},[112,16656,16657],{"class":114,"line":135},[112,16658,272],{"emptyLinePlaceholder":271},[112,16660,16661,16663,16665,16667,16669,16671],{"class":114,"line":147},[112,16662,277],{"class":229},[112,16664,351],{"class":129},[112,16666,354],{"class":229},[112,16668,357],{"class":229},[112,16670,360],{"class":118},[112,16672,363],{"class":236},[112,16674,16675],{"class":114,"line":202},[112,16676,12770],{"class":236},[112,16678,16679,16681,16683],{"class":114,"line":208},[112,16680,12775],{"class":236},[112,16682,12778],{"class":122},[112,16684,288],{"class":236},[112,16686,16687],{"class":114,"line":291},[112,16688,988],{"class":236},[112,16690,16691],{"class":114,"line":299},[112,16692,384],{"class":236},[112,16694,16695],{"class":114,"line":307},[112,16696,272],{"emptyLinePlaceholder":271},[112,16698,16699,16701,16703,16705,16708,16710,16712,16714,16716,16718,16721,16723,16726],{"class":114,"line":315},[112,16700,503],{"class":229},[112,16702,506],{"class":229},[112,16704,509],{"class":229},[112,16706,16707],{"class":118}," createCandidate",[112,16709,456],{"class":236},[112,16711,518],{"class":517},[112,16713,171],{"class":229},[112,16715,523],{"class":129},[112,16717,1046],{"class":236},[112,16719,16720],{"class":517},"atsCandidate",[112,16722,171],{"class":229},[112,16724,16725],{"class":118}," AtsCandidate",[112,16727,526],{"class":236},[112,16729,16730,16732,16734,16736,16738,16740,16743],{"class":114,"line":323},[112,16731,1435],{"class":229},[112,16733,911],{"class":129},[112,16735,354],{"class":229},[112,16737,539],{"class":229},[112,16739,542],{"class":236},[112,16741,16742],{"class":118},"createAtsCandidate",[112,16744,363],{"class":236},[112,16746,16747],{"class":114,"line":329},[112,16748,16749],{"class":236},"        atsCandidate,\n",[112,16751,16752],{"class":114,"line":341},[112,16753,15585],{"class":236},[112,16755,16756],{"class":114,"line":346},[112,16757,15149],{"class":236},[112,16759,16760],{"class":114,"line":366},[112,16761,272],{"emptyLinePlaceholder":271},[112,16763,16764,16766],{"class":114,"line":381},[112,16765,572],{"class":229},[112,16767,16768],{"class":236}," result.atsCandidate?.id;\n",[112,16770,16771],{"class":114,"line":387},[112,16772,584],{"class":236},[112,16774,16775],{"class":114,"line":392},[112,16776,272],{"emptyLinePlaceholder":271},[112,16778,16779,16781,16783,16785,16788,16790,16792,16794,16796,16798,16800,16802,16804,16806,16808,16810,16812],{"class":114,"line":409},[112,16780,503],{"class":229},[112,16782,506],{"class":229},[112,16784,509],{"class":229},[112,16786,16787],{"class":118}," createApplication",[112,16789,456],{"class":236},[112,16791,518],{"class":517},[112,16793,171],{"class":229},[112,16795,523],{"class":129},[112,16797,1046],{"class":236},[112,16799,15556],{"class":517},[112,16801,171],{"class":229},[112,16803,523],{"class":129},[112,16805,1046],{"class":236},[112,16807,14389],{"class":517},[112,16809,171],{"class":229},[112,16811,523],{"class":129},[112,16813,526],{"class":236},[112,16815,16816,16818,16820,16822,16824,16826,16829],{"class":114,"line":422},[112,16817,1435],{"class":229},[112,16819,911],{"class":129},[112,16821,354],{"class":229},[112,16823,539],{"class":229},[112,16825,542],{"class":236},[112,16827,16828],{"class":118},"createAtsApplication",[112,16830,363],{"class":236},[112,16832,16833],{"class":114,"line":435},[112,16834,16835],{"class":236},"        atsApplication: {\n",[112,16837,16838],{"class":114,"line":440},[112,16839,16840],{"class":236},"            candidateId,\n",[112,16842,16843],{"class":114,"line":4949},[112,16844,14495],{"class":236},[112,16846,16847],{"class":114,"line":4960},[112,16848,4803],{"class":236},[112,16850,16851],{"class":114,"line":4972},[112,16852,15585],{"class":236},[112,16854,16855],{"class":114,"line":4984},[112,16856,15149],{"class":236},[112,16858,16859],{"class":114,"line":4992},[112,16860,272],{"emptyLinePlaceholder":271},[112,16862,16863,16865],{"class":114,"line":5000},[112,16864,572],{"class":229},[112,16866,16867],{"class":236}," result.atsApplication?.id;\n",[112,16869,16870],{"class":114,"line":5008},[112,16871,584],{"class":236},[67,16873,16875],{"id":16874},"step-3-uploading-a-resumecvcover-letter-optional","Step 3: uploading a resume/CV/cover letter (optional)",[19,16877,16878,16879,2251,16881,171],{},"You can also upload the candidate's documents. You will need to set the following fields in the ",[109,16880,12994],{},[1614,16882,16884],{"href":12992,"rel":16883},[1618],"object",[72,16886,16887,16889,16892],{},[46,16888,16264],{},[46,16890,16891],{},"application_id",[46,16893,16894],{},"document_url",[19,16896,16897,16898,16903,16904,11338,16906,16908],{},"Some ATS providers may require additional fields to be present. Be sure to check their ",[1614,16899,16902],{"href":16900,"rel":16901},"https://app.unified.to/integrations/greenhouse?tab=support",[1618],"feature support page"," for more information. For example, Greenhouse also requires ",[109,16905,2472],{},[109,16907,16007],{}," fields.",[67,16910,16912],{"id":16911},"step-4-review-the-application-status-optional","Step 4: Review the application status (optional)",[19,16914,16915,16916,2251,16919,16923],{},"If you need to be informed on the status of the candidate's job application, you can use the ",[109,16917,16918],{},"getApplication",[1614,16920,16443],{"href":16921,"rel":16922},"https://docs.unified.to/ats/application/Retrieve_an_application",[1618]," or you can set up a webhook for that connection's modified applications.",[67,16925,16927],{"id":16926},"conclusion","Conclusion",[19,16929,16930,16931,16935],{},"It is easy to support many ATS integrations in your recruiting application and allow your end user to seamlessly move data between the two. Use Unified.to's ",[1614,16932,16934],{"href":1710,"rel":16933},[1618],"Unified ATS API"," to launch integrations in days and harness recruitment data for your candidate sourcing or job board app.",[67,16937,16939],{"id":16938},"additional-resources","Additional resources",[72,16941,16942,16947,16954,16960,16964],{},[46,16943,16944],{},[1614,16945,16934],{"href":1710,"rel":16946},[1618],[46,16948,16949],{},[1614,16950,16953],{"href":16951,"rel":16952},"https://docs.unified.to/ats/overview",[1618],"API Documentation for the Unified ATS API",[46,16955,16956],{},[1614,16957,16959],{"href":12471,"rel":16958},[1618],"SDKs for Unified.to",[46,16961,16962],{},[12408,16963],{"width":12410,"height":12411,"src":16402,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},[46,16965,16966],{},[12408,16967],{"width":12410,"height":12411,"src":16555,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},[1558,16969,16970],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":16972},[16973,16974,16975,16976,16977,16978,16979,16980,16981],{"id":16364,"depth":126,"text":16365},{"id":69,"depth":126,"text":70},{"id":9689,"depth":126,"text":9690},{"id":16422,"depth":126,"text":16423},{"id":16590,"depth":126,"text":16591},{"id":16874,"depth":126,"text":16875},{"id":16911,"depth":126,"text":16912},{"id":16926,"depth":126,"text":16927},{"id":16938,"depth":126,"text":16939},"API integrations are necessary for any modern SaaS app, especially for recruitment solutions like candidate sourcing and job boards that require a high volume...",{"img":16984,"date":16985,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified-icon.png","2024-01-04T00:00:00.000Z","/guides/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified",{"title":16349,"description":16982},"guides/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified","Rjzeme2C3xFHZicmuX1ysWzXSrxGcP-nU4leVuWqfl8",{"id":16991,"title":16992,"body":16993,"description":17007,"extension":1576,"meta":20487,"navigation":271,"path":20490,"seo":20491,"stem":20492,"__hash__":20493},"guides/guides/how_to_build_a_discord_support_bot_with_unified_and_langbase.md","How to build a Discord support bot with Unified.to and Langbase",{"type":9,"value":16994,"toc":20472},[16995,16998,17000,17005,17008,17011,17014,17016,17019,17033,17036,17038,17041,17066,17075,17083,17087,17096,17104,17108,17125,17128,17144,17148,17151,17186,17189,17193,17196,17205,17251,17259,17264,17267,17272,17398,17401,17415,17423,17427,17430,17433,17916,17925,17936,17940,17948,17951,17967,17970,18113,18123,18126,18329,18338,18341,18355,18358,18450,18459,18462,18466,18469,18474,18720,18728,18733,18955,18960,19105,19108,19119,19127,19131,19134,19644,19652,19656,19659,20397,20400,20414,20417,20428,20431,20433,20436,20449,20452,20455,20466,20469],[12,16996,16992],{"id":16997},"how-to-build-a-discord-support-bot-with-unifiedto-and-langbase",[16,16999],{},[19,17001,17002],{},[22,17003,17004],{},"December 12, 2024",[19,17006,17007],{},"Want to build an AI-powered support bot that can answer questions with information from an knowledge base?",[19,17009,17010],{},"In this guide, we'll show you how to combine Unified.to's data ingestion capabilities with Langbase's AI agent framework to create a powerful support bot. We'll pull content from your customers' knowledge management system (like Notion) through Unified.to, process it with Langbase's Memory Agents, and make it available to a Discord bot, powered by Unified.to's Messaging API, so it can answer support questions.",[19,17012,17013],{},"We'll be using React and Typescript in these examples, which you can adapt to fit your framework of choice.",[67,17015,9690],{"id":9689},[19,17017,17018],{},"This guide walks you through how to:",[72,17020,17021,17024,17027,17030],{},[46,17022,17023],{},"Pull knowledge base content using Unified.to's KMS API",[46,17025,17026],{},"Process and prepare this content using Langbase's Memory Agents",[46,17028,17029],{},"Create an AI agent using Langbase Pipes",[46,17031,17032],{},"Send responses through Discord using Unified.to's Messaging API",[19,17034,17035],{},"By combining Unified.to's unified APIs with Langbase's AI capabilities, we get the best of both worlds: easy access to your data sources and powerful AI features without the complexity of building everything from scratch.",[67,17037,13634],{"id":13633},[19,17039,17040],{},"Make sure you have:",[72,17042,17043,17049,17055,17063],{},[46,17044,9638,17045,17048],{},[1614,17046,1640],{"href":11523,"rel":17047},[1618]," account",[46,17050,9638,17051,17048],{},[1614,17052,17054],{"href":1616,"rel":17053},[1618],"Langbase",[46,17056,17057,17058],{},"Access to a knowledge management system (e.g., Notion) containing your support content\n",[72,17059,17060],{},[46,17061,17062],{},"Unified.to allows you to easily access your customers' data and that's normally what you would use in production, but for the purposes of this guide you can follow along with your own Notion account",[46,17064,17065],{},"A Discord server where you want to deploy your bot",[10506,17067,17068],{},[19,17069,17070,17071,17074],{},"If you don't want to use real data from Notion or Discord, you can also take advantage of Unified.to's ",[1614,17072,12396],{"href":9768,"rel":17073},[1618]," and work with synthetic data instead.",[19,17076,17077,17078,17082],{},"The following steps assume you already have your Unified.to account with your workspace ID and API key available. If you're new, check out our ",[1614,17079,17081],{"href":10184,"rel":17080},[1618],"Quick Start guide"," to get familiar with the platform.",[67,17084,17086],{"id":17085},"set-up-your-connections","Set up your connections",[19,17088,17089,17090,17095],{},"The first thing you'll do is activate your preferred KMS platform to be the source of data for your bot. We'll use Notion in this guide, but our ",[1614,17091,17094],{"href":17092,"rel":17093},"https://unified.to/kms",[1618],"KMS API"," supports 8 platforms today and more are being added on a regular basis.",[19,17097,17098,17100,17101,634],{},[478,17099,12467],{}," If you're using the sandbox environment, for the steps below that ask you to enter your OAuth 2 credentials, just enter any random value e.g., ",[109,17102,17103],{},"test123",[35,17105,17107],{"id":17106},"activate-notion-and-discord-integrations","Activate Notion and Discord integrations",[43,17109,17110,17117,17120],{},[46,17111,17112,17113],{},"On app.unified.to, go to the ",[1614,17114,17116],{"href":9741,"rel":17115},[1618],"Integrations page",[46,17118,17119],{},"Search for and select Notion",[46,17121,17122,17123],{},"Choose OAuth 2, enter your credentials (which can be anything if you're using the sandbox environment), and then click ",[478,17124,9760],{},[19,17126,17127],{},"Repeat steps 1-3 but for Discord. If you want to use real data from Notion and Discord, check out our how-to guides on setting up with them:",[72,17129,17130,17137],{},[46,17131,17132],{},[1614,17133,17136],{"href":17134,"rel":17135},"https://docs.unified.to/guides/how_to_set_up_and_configure_notion",[1618],"How to set up and configure Notion",[46,17138,17139],{},[1614,17140,17143],{"href":17141,"rel":17142},"https://docs.unified.to/guides/how_to_get_your_discord_oauth_2_credentials_and_bot_token",[1618],"How to get your Discord OAuth 2 credentials and bot token",[35,17145,17147],{"id":17146},"sandbox-environment-create-a-test-connection-from-the-web-app","(Sandbox environment) Create a test connection from the web app",[19,17149,17150],{},"If you're using the sandbox environment, then you can create test connections easily from the web app.",[43,17152,17153,17159,17165,17174],{},[46,17154,17112,17155,9903],{},[1614,17156,9706],{"href":17157,"rel":17158},"https://app.unified.to/connections",[1618],[46,17160,17161,17162,17164],{},"Click on ",[478,17163,9908],{}," at the top right corner of the page (note: this will only show up if your current environment is the sandbox environment)",[46,17166,17167,17168,11338,17171,17173],{},"Click on the ",[478,17169,17170],{},"Notion",[478,17172,12317],{}," integrations",[46,17175,9757,17176,17179,17182],{},[478,17177,17178],{},"Done",[17180,17181],"br",{},[1603,17183],{"alt":17184,"src":17185},"Screenshot_2024-12-12_at_10.58.17_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_discord_support_bot_with_unified_and_langbase-0.png",[19,17187,17188],{},"Skip ahead to the 'Pull content from your knowledge base' step below.",[35,17190,17192],{"id":17191},"production-environments-add-the-authorization-component-to-your-app","(Production environments) Add the Authorization component to your app",[19,17194,17195],{},"To ask for your customers' permission to access their Notion and Discord accounts, you can add Unified.to's Authorization component to your front-end:",[43,17197,17198],{},[46,17199,17200,17201,17204],{},"Add the following React component to your app. Make sure to replace ",[109,17202,17203],{},"WORKSPACE_ID"," with your actual workspace ID.",[102,17206,17208],{"className":9951,"code":17207,"language":9953,"meta":107,"style":107},"// TODO: Make sure to run 'npm install @unified-api/react-directory'\nimport UnifiedDirectory from '@unified-api/react-directory';\n\n\u003CUnifiedDirectory workspace_id={WORKSPACE_ID}/>\n",[109,17209,17210,17215,17227,17231],{"__ignoreMap":107},[112,17211,17212],{"class":114,"line":115},[112,17213,17214],{"class":578},"// TODO: Make sure to run 'npm install @unified-api/react-directory'\n",[112,17216,17217,17219,17221,17223,17225],{"class":114,"line":126},[112,17218,230],{"class":229},[112,17220,9962],{"class":236},[112,17222,247],{"class":229},[112,17224,9967],{"class":122},[112,17226,237],{"class":236},[112,17228,17229],{"class":114,"line":135},[112,17230,272],{"emptyLinePlaceholder":271},[112,17232,17233,17235,17238,17241,17243,17246,17248],{"class":114,"line":147},[112,17234,14970],{"class":236},[112,17236,17237],{"class":129},"UnifiedDirectory",[112,17239,17240],{"class":118}," workspace_id",[112,17242,335],{"class":229},[112,17244,17245],{"class":236},"{",[112,17247,17203],{"class":129},[112,17249,17250],{"class":236},"}/>\n",[19,17252,17253,17254,634],{},"We also offer pre-built embedded components in Angular, Vue, and Svelte. See other ways to display the Authorization component in your app ",[1614,17255,17258],{"href":17256,"rel":17257},"https://app.unified.to/embed?tab=Authorization",[1618],"here",[72,17260,17261],{},[46,17262,17263],{},"If your customers' mainly interact with you through message-based platforms, you could even send them the Authorization URL through an AI chat agent instead of a web front-end!",[19,17265,17266],{},"The Authorization component displays a list of your integrations. When your user clicks on one of these integrations, the authorization flow will open up in a new tab. Your users will follow the steps to grant you access to their accounts. When that is done, they will be redirected back to your app (the default success URL location).",[43,17268,17269],{},[46,17270,17271],{},"Handle the callback after a user authorizes an integration. The connection ID will be sent back in the success URL - we need to save this to make API calls later on. In this example, we'll save the connection ID to local storage:",[102,17273,17275],{"className":9951,"code":17274,"language":9953,"meta":107,"style":107},"function handleAuthCallback() {\n  const urlParams = new URLSearchParams(window.location.search);\n  const connectionId = urlParams.get('id');\n\n  if (connectionId) {\n    console.log('New connection created:', connectionId);\n// Store this connection ID securely - you'll need it for API calls\n    localStorage.setItem('unifiedConnectionId', connectionId);\n  }\n}\n\nwindow.addEventListener('load', handleAuthCallback);\n",[109,17276,17277,17286,17303,17324,17328,17335,17350,17355,17370,17374,17378,17382],{"__ignoreMap":107},[112,17278,17279,17281,17284],{"class":114,"line":115},[112,17280,9978],{"class":229},[112,17282,17283],{"class":118}," handleAuthCallback",[112,17285,1385],{"class":236},[112,17287,17288,17290,17293,17295,17297,17300],{"class":114,"line":126},[112,17289,531],{"class":229},[112,17291,17292],{"class":129}," urlParams",[112,17294,354],{"class":229},[112,17296,357],{"class":229},[112,17298,17299],{"class":118}," URLSearchParams",[112,17301,17302],{"class":236},"(window.location.search);\n",[112,17304,17305,17307,17309,17311,17314,17317,17319,17322],{"class":114,"line":135},[112,17306,531],{"class":229},[112,17308,13869],{"class":129},[112,17310,354],{"class":229},[112,17312,17313],{"class":236}," urlParams.",[112,17315,17316],{"class":118},"get",[112,17318,456],{"class":236},[112,17320,17321],{"class":122},"'id'",[112,17323,464],{"class":236},[112,17325,17326],{"class":114,"line":147},[112,17327,272],{"emptyLinePlaceholder":271},[112,17329,17330,17332],{"class":114,"line":202},[112,17331,13931],{"class":229},[112,17333,17334],{"class":236}," (connectionId) {\n",[112,17336,17337,17340,17342,17344,17347],{"class":114,"line":208},[112,17338,17339],{"class":236},"    console.",[112,17341,1512],{"class":118},[112,17343,456],{"class":236},[112,17345,17346],{"class":122},"'New connection created:'",[112,17348,17349],{"class":236},", connectionId);\n",[112,17351,17352],{"class":114,"line":291},[112,17353,17354],{"class":578},"// Store this connection ID securely - you'll need it for API calls\n",[112,17356,17357,17360,17363,17365,17368],{"class":114,"line":299},[112,17358,17359],{"class":236},"    localStorage.",[112,17361,17362],{"class":118},"setItem",[112,17364,456],{"class":236},[112,17366,17367],{"class":122},"'unifiedConnectionId'",[112,17369,17349],{"class":236},[112,17371,17372],{"class":114,"line":307},[112,17373,1476],{"class":236},[112,17375,17376],{"class":114,"line":315},[112,17377,584],{"class":236},[112,17379,17380],{"class":114,"line":323},[112,17381,272],{"emptyLinePlaceholder":271},[112,17383,17384,17387,17390,17392,17395],{"class":114,"line":329},[112,17385,17386],{"class":236},"window.",[112,17388,17389],{"class":118},"addEventListener",[112,17391,456],{"class":236},[112,17393,17394],{"class":122},"'load'",[112,17396,17397],{"class":236},", handleAuthCallback);\n",[19,17399,17400],{},"For this guide, you can be your own test user:",[43,17402,17403,17406,17409,17412],{},[46,17404,17405],{},"Click on the Notion integration in the Authorization component",[46,17407,17408],{},"Grant access to your Notion workspace",[46,17410,17411],{},"Repeat for Discord",[46,17413,17414],{},"Save both connection IDs - you'll need them for the next steps",[19,17416,17417,17418,634],{},"Note: In production, you should associate these connection IDs with your user's account in your database. For more information, see our guide on ",[1614,17419,17422],{"href":17420,"rel":17421},"https://docs.unified.to/guides/how_to_associate_a_connection_id_with_your_end_user",[1618],"How to associate connection IDs with your users",[67,17424,17426],{"id":17425},"pull-content-from-your-knowledge-base","Pull content from your knowledge base",[19,17428,17429],{},"Now that you've got a connection ID, we can start making calls to the Unified API!",[19,17431,17432],{},"First, let's write some functions to recursively fetch all content from your KMS:",[102,17434,17436],{"className":9951,"code":17435,"language":9953,"meta":107,"style":107},"async function fetchContent(connectionId: string, apiKey: string) {\n  const spaces = await fetchAllSpaces(connectionId, apiKey);\n  const allContent = [];\n\n  for (const space of spaces) {\n    const pages = await fetchPagesInSpace(connectionId, apiKey, space.id);\n    allContent.push(...pages);\n  }\n\n  return allContent;\n}\n\nasync function fetchAllSpaces(connectionId: string, apiKey: string) {\n  const response = await fetch(\n    `https://api.unified.to/kms/${connectionId}/space?limit=100`,\n    {\n      headers: {\n        Authorization: `Bearer ${apiKey}`,\n      }\n    }\n  );\n\n  if (!response.ok) {\n    throw new Error(`Failed to fetch spaces: ${response.statusText}`);\n  }\n\n  return response.json();\n}\n\nasync function fetchPagesInSpace(connectionId: string, apiKey: string, spaceId: string) {\n  const response = await fetch(\n    `https://api.unified.to/kms/${connectionId}/page?limit=100&space_id=${spaceId}`,\n    {\n      headers: {\n        Authorization: `Bearer ${apiKey}`,\n      }\n    }\n  );\n\n  if (!response.ok) {\n    throw new Error(`Failed to fetch pages: ${response.statusText}`);\n  }\n\n  return response.json();\n}\n\n// Usage\nconst content = await fetchContent(CONNECTION_ID, API_KEY);\n",[109,17437,17438,17466,17483,17494,17498,17514,17531,17545,17549,17553,17560,17564,17568,17594,17611,17623,17627,17632,17645,17650,17654,17658,17662,17673,17700,17704,17708,17719,17723,17727,17762,17776,17791,17795,17799,17811,17815,17819,17823,17827,17837,17860,17864,17868,17878,17882,17886,17891],{"__ignoreMap":107},[112,17439,17440,17442,17444,17447,17449,17451,17453,17455,17457,17460,17462,17464],{"class":114,"line":115},[112,17441,1377],{"class":229},[112,17443,509],{"class":229},[112,17445,17446],{"class":118}," fetchContent",[112,17448,456],{"class":236},[112,17450,518],{"class":517},[112,17452,171],{"class":229},[112,17454,523],{"class":129},[112,17456,1046],{"class":236},[112,17458,17459],{"class":517},"apiKey",[112,17461,171],{"class":229},[112,17463,523],{"class":129},[112,17465,526],{"class":236},[112,17467,17468,17470,17473,17475,17477,17480],{"class":114,"line":126},[112,17469,531],{"class":229},[112,17471,17472],{"class":129}," spaces",[112,17474,354],{"class":229},[112,17476,539],{"class":229},[112,17478,17479],{"class":118}," fetchAllSpaces",[112,17481,17482],{"class":236},"(connectionId, apiKey);\n",[112,17484,17485,17487,17490,17492],{"class":114,"line":135},[112,17486,531],{"class":229},[112,17488,17489],{"class":129}," allContent",[112,17491,354],{"class":229},[112,17493,1292],{"class":236},[112,17495,17496],{"class":114,"line":147},[112,17497,272],{"emptyLinePlaceholder":271},[112,17499,17500,17502,17504,17506,17509,17511],{"class":114,"line":202},[112,17501,1416],{"class":229},[112,17503,1419],{"class":236},[112,17505,277],{"class":229},[112,17507,17508],{"class":129}," space",[112,17510,1427],{"class":229},[112,17512,17513],{"class":236}," spaces) {\n",[112,17515,17516,17518,17521,17523,17525,17528],{"class":114,"line":208},[112,17517,1435],{"class":229},[112,17519,17520],{"class":129}," pages",[112,17522,354],{"class":229},[112,17524,539],{"class":229},[112,17526,17527],{"class":118}," fetchPagesInSpace",[112,17529,17530],{"class":236},"(connectionId, apiKey, space.id);\n",[112,17532,17533,17536,17538,17540,17542],{"class":114,"line":291},[112,17534,17535],{"class":236},"    allContent.",[112,17537,14547],{"class":118},[112,17539,456],{"class":236},[112,17541,14552],{"class":229},[112,17543,17544],{"class":236},"pages);\n",[112,17546,17547],{"class":114,"line":299},[112,17548,1476],{"class":236},[112,17550,17551],{"class":114,"line":307},[112,17552,272],{"emptyLinePlaceholder":271},[112,17554,17555,17557],{"class":114,"line":315},[112,17556,621],{"class":229},[112,17558,17559],{"class":236}," allContent;\n",[112,17561,17562],{"class":114,"line":323},[112,17563,584],{"class":236},[112,17565,17566],{"class":114,"line":329},[112,17567,272],{"emptyLinePlaceholder":271},[112,17569,17570,17572,17574,17576,17578,17580,17582,17584,17586,17588,17590,17592],{"class":114,"line":341},[112,17571,1377],{"class":229},[112,17573,509],{"class":229},[112,17575,17479],{"class":118},[112,17577,456],{"class":236},[112,17579,518],{"class":517},[112,17581,171],{"class":229},[112,17583,523],{"class":129},[112,17585,1046],{"class":236},[112,17587,17459],{"class":517},[112,17589,171],{"class":229},[112,17591,523],{"class":129},[112,17593,526],{"class":236},[112,17595,17596,17598,17601,17603,17605,17608],{"class":114,"line":346},[112,17597,531],{"class":229},[112,17599,17600],{"class":129}," response",[112,17602,354],{"class":229},[112,17604,539],{"class":229},[112,17606,17607],{"class":118}," fetch",[112,17609,17610],{"class":236},"(\n",[112,17612,17613,17616,17618,17621],{"class":114,"line":366},[112,17614,17615],{"class":122},"    `https://api.unified.to/kms/${",[112,17617,518],{"class":236},[112,17619,17620],{"class":122},"}/space?limit=100`",[112,17622,288],{"class":236},[112,17624,17625],{"class":114,"line":381},[112,17626,1076],{"class":236},[112,17628,17629],{"class":114,"line":387},[112,17630,17631],{"class":236},"      headers: {\n",[112,17633,17634,17637,17639,17641,17643],{"class":114,"line":392},[112,17635,17636],{"class":236},"        Authorization: ",[112,17638,14069],{"class":122},[112,17640,17459],{"class":236},[112,17642,640],{"class":122},[112,17644,288],{"class":236},[112,17646,17647],{"class":114,"line":409},[112,17648,17649],{"class":236},"      }\n",[112,17651,17652],{"class":114,"line":422},[112,17653,3946],{"class":236},[112,17655,17656],{"class":114,"line":435},[112,17657,10038],{"class":236},[112,17659,17660],{"class":114,"line":440},[112,17661,272],{"emptyLinePlaceholder":271},[112,17663,17664,17666,17668,17670],{"class":114,"line":4949},[112,17665,13931],{"class":229},[112,17667,1419],{"class":236},[112,17669,375],{"class":229},[112,17671,17672],{"class":236},"response.ok) {\n",[112,17674,17675,17678,17680,17683,17685,17688,17691,17693,17696,17698],{"class":114,"line":4960},[112,17676,17677],{"class":229},"    throw",[112,17679,357],{"class":229},[112,17681,17682],{"class":118}," Error",[112,17684,456],{"class":236},[112,17686,17687],{"class":122},"`Failed to fetch spaces: ${",[112,17689,17690],{"class":236},"response",[112,17692,634],{"class":122},[112,17694,17695],{"class":236},"statusText",[112,17697,640],{"class":122},[112,17699,464],{"class":236},[112,17701,17702],{"class":114,"line":4972},[112,17703,1476],{"class":236},[112,17705,17706],{"class":114,"line":4984},[112,17707,272],{"emptyLinePlaceholder":271},[112,17709,17710,17712,17715,17717],{"class":114,"line":4992},[112,17711,621],{"class":229},[112,17713,17714],{"class":236}," response.",[112,17716,2320],{"class":118},[112,17718,1536],{"class":236},[112,17720,17721],{"class":114,"line":5000},[112,17722,584],{"class":236},[112,17724,17725],{"class":114,"line":5008},[112,17726,272],{"emptyLinePlaceholder":271},[112,17728,17729,17731,17733,17735,17737,17739,17741,17743,17745,17747,17749,17751,17753,17756,17758,17760],{"class":114,"line":5016},[112,17730,1377],{"class":229},[112,17732,509],{"class":229},[112,17734,17527],{"class":118},[112,17736,456],{"class":236},[112,17738,518],{"class":517},[112,17740,171],{"class":229},[112,17742,523],{"class":129},[112,17744,1046],{"class":236},[112,17746,17459],{"class":517},[112,17748,171],{"class":229},[112,17750,523],{"class":129},[112,17752,1046],{"class":236},[112,17754,17755],{"class":517},"spaceId",[112,17757,171],{"class":229},[112,17759,523],{"class":129},[112,17761,526],{"class":236},[112,17763,17764,17766,17768,17770,17772,17774],{"class":114,"line":5024},[112,17765,531],{"class":229},[112,17767,17600],{"class":129},[112,17769,354],{"class":229},[112,17771,539],{"class":229},[112,17773,17607],{"class":118},[112,17775,17610],{"class":236},[112,17777,17778,17780,17782,17785,17787,17789],{"class":114,"line":5032},[112,17779,17615],{"class":122},[112,17781,518],{"class":236},[112,17783,17784],{"class":122},"}/page?limit=100&space_id=${",[112,17786,17755],{"class":236},[112,17788,640],{"class":122},[112,17790,288],{"class":236},[112,17792,17793],{"class":114,"line":5040},[112,17794,1076],{"class":236},[112,17796,17797],{"class":114,"line":5046},[112,17798,17631],{"class":236},[112,17800,17801,17803,17805,17807,17809],{"class":114,"line":5052},[112,17802,17636],{"class":236},[112,17804,14069],{"class":122},[112,17806,17459],{"class":236},[112,17808,640],{"class":122},[112,17810,288],{"class":236},[112,17812,17813],{"class":114,"line":5061},[112,17814,17649],{"class":236},[112,17816,17817],{"class":114,"line":5066},[112,17818,3946],{"class":236},[112,17820,17821],{"class":114,"line":9217},[112,17822,10038],{"class":236},[112,17824,17825],{"class":114,"line":9225},[112,17826,272],{"emptyLinePlaceholder":271},[112,17828,17829,17831,17833,17835],{"class":114,"line":9237},[112,17830,13931],{"class":229},[112,17832,1419],{"class":236},[112,17834,375],{"class":229},[112,17836,17672],{"class":236},[112,17838,17839,17841,17843,17845,17847,17850,17852,17854,17856,17858],{"class":114,"line":9248},[112,17840,17677],{"class":229},[112,17842,357],{"class":229},[112,17844,17682],{"class":118},[112,17846,456],{"class":236},[112,17848,17849],{"class":122},"`Failed to fetch pages: ${",[112,17851,17690],{"class":236},[112,17853,634],{"class":122},[112,17855,17695],{"class":236},[112,17857,640],{"class":122},[112,17859,464],{"class":236},[112,17861,17862],{"class":114,"line":9253},[112,17863,1476],{"class":236},[112,17865,17866],{"class":114,"line":9261},[112,17867,272],{"emptyLinePlaceholder":271},[112,17869,17870,17872,17874,17876],{"class":114,"line":9267},[112,17871,621],{"class":229},[112,17873,17714],{"class":236},[112,17875,2320],{"class":118},[112,17877,1536],{"class":236},[112,17879,17880],{"class":114,"line":9272},[112,17881,584],{"class":236},[112,17883,17884],{"class":114,"line":9280},[112,17885,272],{"emptyLinePlaceholder":271},[112,17887,17888],{"class":114,"line":9293},[112,17889,17890],{"class":578},"// Usage\n",[112,17892,17893,17895,17898,17900,17902,17904,17906,17909,17911,17914],{"class":114,"line":9304},[112,17894,277],{"class":229},[112,17896,17897],{"class":129}," content",[112,17899,354],{"class":229},[112,17901,539],{"class":229},[112,17903,17446],{"class":118},[112,17905,456],{"class":236},[112,17907,17908],{"class":129},"CONNECTION_ID",[112,17910,1046],{"class":236},[112,17912,17913],{"class":129},"API_KEY",[112,17915,464],{"class":236},[19,17917,17918,2335,17921],{},[478,17919,17920],{},"API reference",[1614,17922,13288],{"href":17923,"rel":17924},"https://docs.unified.to/kms/overview",[1618],[19,17926,17927,17928,17931,17932,634],{},"Call ",[109,17929,17930],{},"fetchContent"," in your app to see the results. You should see a collection of ",[1614,17933,17935],{"href":13309,"rel":17934},[1618],"Pages",[67,17937,17939],{"id":17938},"process-the-content-with-langbase-memory-agents","Process the content with Langbase Memory Agents",[19,17941,17942,17943,17947],{},"Now that we have our knowledge base content, we need to prepare it for AI consumption. Instead of building a complex RAG pipeline ourselves, we'll use Langbase's ",[1614,17944,17946],{"href":1677,"rel":17945},[1618],"Memory Agents"," to handle all the heavy lifting - from text processing to embedding generation and storage.",[19,17949,17950],{},"First, let's install the Langbase SDK:",[102,17952,17956],{"className":17953,"code":17954,"language":17955,"meta":107,"style":107},"language-shell shiki shiki-themes github-dark github-dark github-light","npm install langbase\n","shell",[109,17957,17958],{"__ignoreMap":107},[112,17959,17960,17962,17964],{"class":114,"line":115},[112,17961,138],{"class":118},[112,17963,152],{"class":122},[112,17965,17966],{"class":122}," langbase\n",[19,17968,17969],{},"Now we can create memory to store our knowledge base:",[102,17971,17973],{"className":220,"code":17972,"language":222,"meta":107,"style":107},"import { Langbase } from 'langbase';\n\nconst langbase = new Langbase({\n  apiKey: process.env.LANGBASE_API_KEY!,\n});\n\nasync function createKnowledgeBase() {\n// Create a new memory\n  const memory = await langbase.memory.create({\n    name: 'support-bot-knowledge',\n    description: 'Knowledge base for our support bot',\n    embedding_model: 'openai:text-embedding-3-large'// Using OpenAI's latest model\n  });\n\n  return memory;\n}\n",[109,17974,17975,17989,17993,18008,18020,18024,18028,18039,18044,18063,18073,18083,18094,18098,18102,18109],{"__ignoreMap":107},[112,17976,17977,17979,17982,17984,17987],{"class":114,"line":115},[112,17978,230],{"class":229},[112,17980,17981],{"class":236}," { Langbase } ",[112,17983,247],{"class":229},[112,17985,17986],{"class":122}," 'langbase'",[112,17988,237],{"class":236},[112,17990,17991],{"class":114,"line":126},[112,17992,272],{"emptyLinePlaceholder":271},[112,17994,17995,17997,18000,18002,18004,18006],{"class":114,"line":135},[112,17996,277],{"class":229},[112,17998,17999],{"class":129}," langbase",[112,18001,354],{"class":229},[112,18003,357],{"class":229},[112,18005,1762],{"class":118},[112,18007,363],{"class":236},[112,18009,18010,18013,18016,18018],{"class":114,"line":147},[112,18011,18012],{"class":236},"  apiKey: process.env.",[112,18014,18015],{"class":129},"LANGBASE_API_KEY",[112,18017,375],{"class":229},[112,18019,288],{"class":236},[112,18021,18022],{"class":114,"line":202},[112,18023,384],{"class":236},[112,18025,18026],{"class":114,"line":208},[112,18027,272],{"emptyLinePlaceholder":271},[112,18029,18030,18032,18034,18037],{"class":114,"line":291},[112,18031,1377],{"class":229},[112,18033,509],{"class":229},[112,18035,18036],{"class":118}," createKnowledgeBase",[112,18038,1385],{"class":236},[112,18040,18041],{"class":114,"line":299},[112,18042,18043],{"class":578},"// Create a new memory\n",[112,18045,18046,18048,18051,18053,18055,18058,18061],{"class":114,"line":307},[112,18047,531],{"class":229},[112,18049,18050],{"class":129}," memory",[112,18052,354],{"class":229},[112,18054,539],{"class":229},[112,18056,18057],{"class":236}," langbase.memory.",[112,18059,18060],{"class":118},"create",[112,18062,363],{"class":236},[112,18064,18065,18068,18071],{"class":114,"line":315},[112,18066,18067],{"class":236},"    name: ",[112,18069,18070],{"class":122},"'support-bot-knowledge'",[112,18072,288],{"class":236},[112,18074,18075,18078,18081],{"class":114,"line":323},[112,18076,18077],{"class":236},"    description: ",[112,18079,18080],{"class":122},"'Knowledge base for our support bot'",[112,18082,288],{"class":236},[112,18084,18085,18088,18091],{"class":114,"line":329},[112,18086,18087],{"class":236},"    embedding_model: ",[112,18089,18090],{"class":122},"'openai:text-embedding-3-large'",[112,18092,18093],{"class":578},"// Using OpenAI's latest model\n",[112,18095,18096],{"class":114,"line":341},[112,18097,567],{"class":236},[112,18099,18100],{"class":114,"line":346},[112,18101,272],{"emptyLinePlaceholder":271},[112,18103,18104,18106],{"class":114,"line":366},[112,18105,621],{"class":229},[112,18107,18108],{"class":236}," memory;\n",[112,18110,18111],{"class":114,"line":381},[112,18112,584],{"class":236},[19,18114,18115,2251,18118],{},[478,18116,18117],{},"API reference:",[1614,18119,18122],{"href":18120,"rel":18121},"https://langbase.com/docs/sdk/memory/create",[1618],"Create memory",[19,18124,18125],{},"Now let's process our Unified.to content and upload it to Langbase:",[102,18127,18129],{"className":220,"code":18128,"language":222,"meta":107,"style":107},"async function uploadContentToMemory(pages, memoryName: string) {\n  for (const page of pages) {\n    // Download the page content from Unified.to's download_url\n    const content = await fetch(page.download_url).then(res => res.text());\n    \n    // Create a buffer from the content\n    const documentBuffer = Buffer.from(content);\n    \n    // Upload to Langbase with metadata\n    await langbase.memory.documents.upload({\n      memoryName,\n      documentName: page.title,\n      document: documentBuffer,\n      contentType: 'text/markdown', // Adjust based on your content type\n      meta: {\n        source: 'unified_kms',\n        created_at: page.created_at,\n        updated_at: page.updated_at,\n        space_id: page.space_id\n      }\n    });\n  }\n}\n",[109,18130,18131,18156,18171,18176,18208,18213,18218,18234,18238,18243,18255,18260,18265,18270,18283,18288,18298,18303,18308,18313,18317,18321,18325],{"__ignoreMap":107},[112,18132,18133,18135,18137,18140,18142,18145,18147,18150,18152,18154],{"class":114,"line":115},[112,18134,1377],{"class":229},[112,18136,509],{"class":229},[112,18138,18139],{"class":118}," uploadContentToMemory",[112,18141,456],{"class":236},[112,18143,18144],{"class":517},"pages",[112,18146,1046],{"class":236},[112,18148,18149],{"class":517},"memoryName",[112,18151,171],{"class":229},[112,18153,523],{"class":129},[112,18155,526],{"class":236},[112,18157,18158,18160,18162,18164,18166,18168],{"class":114,"line":126},[112,18159,1416],{"class":229},[112,18161,1419],{"class":236},[112,18163,277],{"class":229},[112,18165,9903],{"class":129},[112,18167,1427],{"class":229},[112,18169,18170],{"class":236}," pages) {\n",[112,18172,18173],{"class":114,"line":135},[112,18174,18175],{"class":578},"    // Download the page content from Unified.to's download_url\n",[112,18177,18178,18180,18182,18184,18186,18188,18191,18194,18196,18198,18201,18204,18206],{"class":114,"line":147},[112,18179,1435],{"class":229},[112,18181,17897],{"class":129},[112,18183,354],{"class":229},[112,18185,539],{"class":229},[112,18187,17607],{"class":118},[112,18189,18190],{"class":236},"(page.download_url).",[112,18192,18193],{"class":118},"then",[112,18195,456],{"class":236},[112,18197,13855],{"class":517},[112,18199,18200],{"class":229}," =>",[112,18202,18203],{"class":236}," res.",[112,18205,177],{"class":118},[112,18207,13917],{"class":236},[112,18209,18210],{"class":114,"line":202},[112,18211,18212],{"class":236},"    \n",[112,18214,18215],{"class":114,"line":208},[112,18216,18217],{"class":578},"    // Create a buffer from the content\n",[112,18219,18220,18222,18225,18227,18229,18231],{"class":114,"line":291},[112,18221,1435],{"class":229},[112,18223,18224],{"class":129}," documentBuffer",[112,18226,354],{"class":229},[112,18228,13758],{"class":236},[112,18230,247],{"class":118},[112,18232,18233],{"class":236},"(content);\n",[112,18235,18236],{"class":114,"line":299},[112,18237,18212],{"class":236},[112,18239,18240],{"class":114,"line":307},[112,18241,18242],{"class":578},"    // Upload to Langbase with metadata\n",[112,18244,18245,18247,18250,18253],{"class":114,"line":315},[112,18246,1466],{"class":229},[112,18248,18249],{"class":236}," langbase.memory.documents.",[112,18251,18252],{"class":118},"upload",[112,18254,363],{"class":236},[112,18256,18257],{"class":114,"line":323},[112,18258,18259],{"class":236},"      memoryName,\n",[112,18261,18262],{"class":114,"line":329},[112,18263,18264],{"class":236},"      documentName: page.title,\n",[112,18266,18267],{"class":114,"line":341},[112,18268,18269],{"class":236},"      document: documentBuffer,\n",[112,18271,18272,18275,18278,18280],{"class":114,"line":346},[112,18273,18274],{"class":236},"      contentType: ",[112,18276,18277],{"class":122},"'text/markdown'",[112,18279,1046],{"class":236},[112,18281,18282],{"class":578},"// Adjust based on your content type\n",[112,18284,18285],{"class":114,"line":366},[112,18286,18287],{"class":236},"      meta: {\n",[112,18289,18290,18293,18296],{"class":114,"line":381},[112,18291,18292],{"class":236},"        source: ",[112,18294,18295],{"class":122},"'unified_kms'",[112,18297,288],{"class":236},[112,18299,18300],{"class":114,"line":387},[112,18301,18302],{"class":236},"        created_at: page.created_at,\n",[112,18304,18305],{"class":114,"line":392},[112,18306,18307],{"class":236},"        updated_at: page.updated_at,\n",[112,18309,18310],{"class":114,"line":409},[112,18311,18312],{"class":236},"        space_id: page.space_id\n",[112,18314,18315],{"class":114,"line":422},[112,18316,17649],{"class":236},[112,18318,18319],{"class":114,"line":435},[112,18320,15149],{"class":236},[112,18322,18323],{"class":114,"line":440},[112,18324,1476],{"class":236},[112,18326,18327],{"class":114,"line":4949},[112,18328,584],{"class":236},[19,18330,18331,2251,18333],{},[478,18332,18117],{},[1614,18334,18337],{"href":18335,"rel":18336},"https://langbase.com/docs/sdk/memory/document-upload",[1618],"Upload document",[19,18339,18340],{},"Langbase's Memory Agents will automatically:",[43,18342,18343,18346,18349,18352],{},[46,18344,18345],{},"Process the text (Unified.to's data models have already cleaned the data for you!)",[46,18347,18348],{},"Split content into optimal chunks",[46,18350,18351],{},"Generate embeddings using state-of-the-art models",[46,18353,18354],{},"Store and index everything for fast retrieval",[19,18356,18357],{},"Once your content is uploaded, you can create a Pipe to handle natural language interactions. Pipes are custom AI agents that can be exposed as APIs, making them perfect for our Discord bot:",[102,18359,18361],{"className":220,"code":18360,"language":222,"meta":107,"style":107},"async function createSupportBotPipe(memoryName: string) {\n  const pipe = await langbase.pipe.create({\n    name: 'Support Bot',\n    type: 'chat',\n    memory: memoryName,\n    description: 'Support bot powered by our knowledge base'\n  });\n\n  return pipe;\n}\n",[109,18362,18363,18382,18400,18409,18419,18424,18431,18435,18439,18446],{"__ignoreMap":107},[112,18364,18365,18367,18369,18372,18374,18376,18378,18380],{"class":114,"line":115},[112,18366,1377],{"class":229},[112,18368,509],{"class":229},[112,18370,18371],{"class":118}," createSupportBotPipe",[112,18373,456],{"class":236},[112,18375,18149],{"class":517},[112,18377,171],{"class":229},[112,18379,523],{"class":129},[112,18381,526],{"class":236},[112,18383,18384,18386,18389,18391,18393,18396,18398],{"class":114,"line":126},[112,18385,531],{"class":229},[112,18387,18388],{"class":129}," pipe",[112,18390,354],{"class":229},[112,18392,539],{"class":229},[112,18394,18395],{"class":236}," langbase.pipe.",[112,18397,18060],{"class":118},[112,18399,363],{"class":236},[112,18401,18402,18404,18407],{"class":114,"line":135},[112,18403,18067],{"class":236},[112,18405,18406],{"class":122},"'Support Bot'",[112,18408,288],{"class":236},[112,18410,18411,18414,18417],{"class":114,"line":147},[112,18412,18413],{"class":236},"    type: ",[112,18415,18416],{"class":122},"'chat'",[112,18418,288],{"class":236},[112,18420,18421],{"class":114,"line":202},[112,18422,18423],{"class":236},"    memory: memoryName,\n",[112,18425,18426,18428],{"class":114,"line":208},[112,18427,18077],{"class":236},[112,18429,18430],{"class":122},"'Support bot powered by our knowledge base'\n",[112,18432,18433],{"class":114,"line":291},[112,18434,567],{"class":236},[112,18436,18437],{"class":114,"line":299},[112,18438,272],{"emptyLinePlaceholder":271},[112,18440,18441,18443],{"class":114,"line":307},[112,18442,621],{"class":229},[112,18444,18445],{"class":236}," pipe;\n",[112,18447,18448],{"class":114,"line":315},[112,18449,584],{"class":236},[19,18451,18452,2335,18454],{},[478,18453,17920],{},[1614,18455,18458],{"href":18456,"rel":18457},"https://langbase.com/docs/sdk/pipe/create",[1618],"Create pipe",[19,18460,18461],{},"This gives you a fully-functional RAG system with just a few API calls. No need to manage embeddings, vector stores, or complex AI infrastructure - Langbase handles all of that for you.",[67,18463,18465],{"id":18464},"set-up-real-time-message-monitoring","Set up real-time message monitoring",[19,18467,18468],{},"To make your support bot responsive, you'll need to set up webhooks to receive notifications when users send messages in Discord channels.",[43,18470,18471],{},[46,18472,18473],{},"Create a webhook to monitor Discord messages:",[102,18475,18477],{"className":9951,"code":18476,"language":9953,"meta":107,"style":107},"async function createDiscordWebhook(connectionId: string, apiKey: string, hookUrl: string) {\n  const response = await fetch(\n    'https://api.unified.to/unified/webhook',\n    {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${apiKey}`,\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        connection_id: connectionId,\n        hook_url: hookUrl,\n        object_type: 'messaging_message',\n        event: 'created'\n      })\n    }\n  );\n\n  if (!response.ok) {\n    throw new Error(`Failed to create webhook: ${response.statusText}`);\n  }\n\n  return response.json();\n}\n\ncreateDiscordWebhook(CONNECTION_ID, API_KEY, 'https://localhost:8000/webhook')\n",[109,18478,18479,18515,18529,18536,18540,18550,18554,18569,18579,18583,18596,18601,18606,18616,18624,18629,18633,18637,18641,18651,18674,18678,18682,18692,18696,18700],{"__ignoreMap":107},[112,18480,18481,18483,18485,18488,18490,18492,18494,18496,18498,18500,18502,18504,18506,18509,18511,18513],{"class":114,"line":115},[112,18482,1377],{"class":229},[112,18484,509],{"class":229},[112,18486,18487],{"class":118}," createDiscordWebhook",[112,18489,456],{"class":236},[112,18491,518],{"class":517},[112,18493,171],{"class":229},[112,18495,523],{"class":129},[112,18497,1046],{"class":236},[112,18499,17459],{"class":517},[112,18501,171],{"class":229},[112,18503,523],{"class":129},[112,18505,1046],{"class":236},[112,18507,18508],{"class":517},"hookUrl",[112,18510,171],{"class":229},[112,18512,523],{"class":129},[112,18514,526],{"class":236},[112,18516,18517,18519,18521,18523,18525,18527],{"class":114,"line":126},[112,18518,531],{"class":229},[112,18520,17600],{"class":129},[112,18522,354],{"class":229},[112,18524,539],{"class":229},[112,18526,17607],{"class":118},[112,18528,17610],{"class":236},[112,18530,18531,18534],{"class":114,"line":135},[112,18532,18533],{"class":122},"    'https://api.unified.to/unified/webhook'",[112,18535,288],{"class":236},[112,18537,18538],{"class":114,"line":147},[112,18539,1076],{"class":236},[112,18541,18542,18545,18548],{"class":114,"line":202},[112,18543,18544],{"class":236},"      method: ",[112,18546,18547],{"class":122},"'POST'",[112,18549,288],{"class":236},[112,18551,18552],{"class":114,"line":208},[112,18553,17631],{"class":236},[112,18555,18556,18559,18561,18563,18565,18567],{"class":114,"line":291},[112,18557,18558],{"class":122},"        'Authorization'",[112,18560,2335],{"class":236},[112,18562,14069],{"class":122},[112,18564,17459],{"class":236},[112,18566,640],{"class":122},[112,18568,288],{"class":236},[112,18570,18571,18574,18576],{"class":114,"line":299},[112,18572,18573],{"class":122},"        'Content-Type'",[112,18575,2335],{"class":236},[112,18577,18578],{"class":122},"'application/json'\n",[112,18580,18581],{"class":114,"line":307},[112,18582,955],{"class":236},[112,18584,18585,18588,18590,18592,18594],{"class":114,"line":315},[112,18586,18587],{"class":236},"      body: ",[112,18589,13765],{"class":129},[112,18591,634],{"class":236},[112,18593,13770],{"class":118},[112,18595,363],{"class":236},[112,18597,18598],{"class":114,"line":323},[112,18599,18600],{"class":236},"        connection_id: connectionId,\n",[112,18602,18603],{"class":114,"line":329},[112,18604,18605],{"class":236},"        hook_url: hookUrl,\n",[112,18607,18608,18611,18614],{"class":114,"line":341},[112,18609,18610],{"class":236},"        object_type: ",[112,18612,18613],{"class":122},"'messaging_message'",[112,18615,288],{"class":236},[112,18617,18618,18621],{"class":114,"line":346},[112,18619,18620],{"class":236},"        event: ",[112,18622,18623],{"class":122},"'created'\n",[112,18625,18626],{"class":114,"line":366},[112,18627,18628],{"class":236},"      })\n",[112,18630,18631],{"class":114,"line":381},[112,18632,3946],{"class":236},[112,18634,18635],{"class":114,"line":387},[112,18636,10038],{"class":236},[112,18638,18639],{"class":114,"line":392},[112,18640,272],{"emptyLinePlaceholder":271},[112,18642,18643,18645,18647,18649],{"class":114,"line":409},[112,18644,13931],{"class":229},[112,18646,1419],{"class":236},[112,18648,375],{"class":229},[112,18650,17672],{"class":236},[112,18652,18653,18655,18657,18659,18661,18664,18666,18668,18670,18672],{"class":114,"line":422},[112,18654,17677],{"class":229},[112,18656,357],{"class":229},[112,18658,17682],{"class":118},[112,18660,456],{"class":236},[112,18662,18663],{"class":122},"`Failed to create webhook: ${",[112,18665,17690],{"class":236},[112,18667,634],{"class":122},[112,18669,17695],{"class":236},[112,18671,640],{"class":122},[112,18673,464],{"class":236},[112,18675,18676],{"class":114,"line":435},[112,18677,1476],{"class":236},[112,18679,18680],{"class":114,"line":440},[112,18681,272],{"emptyLinePlaceholder":271},[112,18683,18684,18686,18688,18690],{"class":114,"line":4949},[112,18685,621],{"class":229},[112,18687,17714],{"class":236},[112,18689,2320],{"class":118},[112,18691,1536],{"class":236},[112,18693,18694],{"class":114,"line":4960},[112,18695,584],{"class":236},[112,18697,18698],{"class":114,"line":4972},[112,18699,272],{"emptyLinePlaceholder":271},[112,18701,18702,18705,18707,18709,18711,18713,18715,18718],{"class":114,"line":4984},[112,18703,18704],{"class":118},"createDiscordWebhook",[112,18706,456],{"class":236},[112,18708,17908],{"class":129},[112,18710,1046],{"class":236},[112,18712,17913],{"class":129},[112,18714,1046],{"class":236},[112,18716,18717],{"class":122},"'https://localhost:8000/webhook'",[112,18719,15267],{"class":236},[19,18721,18722,2335,18724],{},[478,18723,17920],{},[1614,18725,18727],{"href":14661,"rel":18726},[1618],"Create a webhook",[43,18729,18730],{},[46,18731,18732],{},"Set up an endpoint on your server to handle incoming webhook events. For example:",[102,18734,18736],{"className":9951,"code":18735,"language":9953,"meta":107,"style":107},"app.post('/webhook', async (req, res) => {\n    // Verify webhook signature\n  const { data, webhook, nonce, sig } = req.body;\n\n    // Handle new messages\n  for (const message of data) {\n        // Ignore messages from the bot itself\n    if (message.author_member.id === BOT_USER_ID) continue;\n\n        // Process the message and generate a response\n    const response = await generateBotResponse(message.message);\n\n        // Send the response back to the channel\n    await sendDiscordResponse(\n      DISCORD_CONNECTION_ID,\n      API_KEY,\n      message.channel_id,\n      response\n    );\n  }\n\n  res.sendStatus(200);\n});\n",[109,18737,18738,18769,18774,18807,18811,18816,18832,18837,18856,18860,18865,18881,18885,18890,18899,18906,18913,18918,18923,18928,18932,18936,18951],{"__ignoreMap":107},[112,18739,18740,18743,18746,18748,18751,18753,18755,18757,18759,18761,18763,18765,18767],{"class":114,"line":115},[112,18741,18742],{"class":236},"app.",[112,18744,18745],{"class":118},"post",[112,18747,456],{"class":236},[112,18749,18750],{"class":122},"'/webhook'",[112,18752,1046],{"class":236},[112,18754,1377],{"class":229},[112,18756,1419],{"class":236},[112,18758,13850],{"class":517},[112,18760,1046],{"class":236},[112,18762,13855],{"class":517},[112,18764,745],{"class":236},[112,18766,748],{"class":229},[112,18768,280],{"class":236},[112,18770,18771],{"class":114,"line":126},[112,18772,18773],{"class":578},"    // Verify webhook signature\n",[112,18775,18776,18778,18781,18784,18786,18789,18791,18794,18796,18799,18802,18804],{"class":114,"line":135},[112,18777,531],{"class":229},[112,18779,18780],{"class":236}," { ",[112,18782,18783],{"class":129},"data",[112,18785,1046],{"class":236},[112,18787,18788],{"class":129},"webhook",[112,18790,1046],{"class":236},[112,18792,18793],{"class":129},"nonce",[112,18795,1046],{"class":236},[112,18797,18798],{"class":129},"sig",[112,18800,18801],{"class":236}," } ",[112,18803,335],{"class":229},[112,18805,18806],{"class":236}," req.body;\n",[112,18808,18809],{"class":114,"line":147},[112,18810,272],{"emptyLinePlaceholder":271},[112,18812,18813],{"class":114,"line":202},[112,18814,18815],{"class":578},"    // Handle new messages\n",[112,18817,18818,18820,18822,18824,18827,18829],{"class":114,"line":208},[112,18819,1416],{"class":229},[112,18821,1419],{"class":236},[112,18823,277],{"class":229},[112,18825,18826],{"class":129}," message",[112,18828,1427],{"class":229},[112,18830,18831],{"class":236}," data) {\n",[112,18833,18834],{"class":114,"line":291},[112,18835,18836],{"class":578},"        // Ignore messages from the bot itself\n",[112,18838,18839,18841,18844,18846,18849,18851,18854],{"class":114,"line":299},[112,18840,15209],{"class":229},[112,18842,18843],{"class":236}," (message.author_member.id ",[112,18845,14573],{"class":229},[112,18847,18848],{"class":129}," BOT_USER_ID",[112,18850,745],{"class":236},[112,18852,18853],{"class":229},"continue",[112,18855,237],{"class":236},[112,18857,18858],{"class":114,"line":307},[112,18859,272],{"emptyLinePlaceholder":271},[112,18861,18862],{"class":114,"line":315},[112,18863,18864],{"class":578},"        // Process the message and generate a response\n",[112,18866,18867,18869,18871,18873,18875,18878],{"class":114,"line":323},[112,18868,1435],{"class":229},[112,18870,17600],{"class":129},[112,18872,354],{"class":229},[112,18874,539],{"class":229},[112,18876,18877],{"class":118}," generateBotResponse",[112,18879,18880],{"class":236},"(message.message);\n",[112,18882,18883],{"class":114,"line":329},[112,18884,272],{"emptyLinePlaceholder":271},[112,18886,18887],{"class":114,"line":341},[112,18888,18889],{"class":578},"        // Send the response back to the channel\n",[112,18891,18892,18894,18897],{"class":114,"line":346},[112,18893,1466],{"class":229},[112,18895,18896],{"class":118}," sendDiscordResponse",[112,18898,17610],{"class":236},[112,18900,18901,18904],{"class":114,"line":366},[112,18902,18903],{"class":129},"      DISCORD_CONNECTION_ID",[112,18905,288],{"class":236},[112,18907,18908,18911],{"class":114,"line":381},[112,18909,18910],{"class":129},"      API_KEY",[112,18912,288],{"class":236},[112,18914,18915],{"class":114,"line":387},[112,18916,18917],{"class":236},"      message.channel_id,\n",[112,18919,18920],{"class":114,"line":392},[112,18921,18922],{"class":236},"      response\n",[112,18924,18925],{"class":114,"line":409},[112,18926,18927],{"class":236},"    );\n",[112,18929,18930],{"class":114,"line":422},[112,18931,1476],{"class":236},[112,18933,18934],{"class":114,"line":435},[112,18935,272],{"emptyLinePlaceholder":271},[112,18937,18938,18941,18944,18946,18949],{"class":114,"line":440},[112,18939,18940],{"class":236},"  res.",[112,18942,18943],{"class":118},"sendStatus",[112,18945,456],{"class":236},[112,18947,18948],{"class":129},"200",[112,18950,464],{"class":236},[112,18952,18953],{"class":114,"line":4949},[112,18954,384],{"class":236},[43,18956,18957],{},[46,18958,18959],{},"Validate incoming webhooks (recommended):",[102,18961,18963],{"className":9951,"code":18962,"language":9953,"meta":107,"style":107},"const crypto = require('crypto');\n\nfunction verifyWebhookSignature(data, nonce, signature, workspaceSecret) {\n  const hmac = crypto.createHmac('sha1', workspaceSecret);\n  const calculatedSignature = hmac\n    .update(JSON.stringify(data) + nonce)\n    .digest('base64');\n\n  return calculatedSignature === signature;\n}\n",[109,18964,18965,18984,18988,19015,19037,19049,19073,19085,19089,19101],{"__ignoreMap":107},[112,18966,18967,18969,18972,18974,18977,18979,18982],{"class":114,"line":115},[112,18968,277],{"class":229},[112,18970,18971],{"class":129}," crypto",[112,18973,354],{"class":229},[112,18975,18976],{"class":118}," require",[112,18978,456],{"class":236},[112,18980,18981],{"class":122},"'crypto'",[112,18983,464],{"class":236},[112,18985,18986],{"class":114,"line":126},[112,18987,272],{"emptyLinePlaceholder":271},[112,18989,18990,18992,18995,18997,18999,19001,19003,19005,19008,19010,19013],{"class":114,"line":135},[112,18991,9978],{"class":229},[112,18993,18994],{"class":118}," verifyWebhookSignature",[112,18996,456],{"class":236},[112,18998,18783],{"class":517},[112,19000,1046],{"class":236},[112,19002,18793],{"class":517},[112,19004,1046],{"class":236},[112,19006,19007],{"class":517},"signature",[112,19009,1046],{"class":236},[112,19011,19012],{"class":517},"workspaceSecret",[112,19014,526],{"class":236},[112,19016,19017,19019,19022,19024,19027,19030,19032,19034],{"class":114,"line":147},[112,19018,531],{"class":229},[112,19020,19021],{"class":129}," hmac",[112,19023,354],{"class":229},[112,19025,19026],{"class":236}," crypto.",[112,19028,19029],{"class":118},"createHmac",[112,19031,456],{"class":236},[112,19033,15258],{"class":122},[112,19035,19036],{"class":236},", workspaceSecret);\n",[112,19038,19039,19041,19044,19046],{"class":114,"line":202},[112,19040,531],{"class":229},[112,19042,19043],{"class":129}," calculatedSignature",[112,19045,354],{"class":229},[112,19047,19048],{"class":236}," hmac\n",[112,19050,19051,19054,19056,19058,19060,19062,19064,19067,19070],{"class":114,"line":208},[112,19052,19053],{"class":236},"    .",[112,19055,15275],{"class":118},[112,19057,456],{"class":236},[112,19059,13765],{"class":129},[112,19061,634],{"class":236},[112,19063,13770],{"class":118},[112,19065,19066],{"class":236},"(data) ",[112,19068,19069],{"class":229},"+",[112,19071,19072],{"class":236}," nonce)\n",[112,19074,19075,19077,19079,19081,19083],{"class":114,"line":291},[112,19076,19053],{"class":236},[112,19078,15307],{"class":118},[112,19080,456],{"class":236},[112,19082,13781],{"class":122},[112,19084,464],{"class":236},[112,19086,19087],{"class":114,"line":299},[112,19088,272],{"emptyLinePlaceholder":271},[112,19090,19091,19093,19096,19098],{"class":114,"line":307},[112,19092,621],{"class":229},[112,19094,19095],{"class":236}," calculatedSignature ",[112,19097,14573],{"class":229},[112,19099,19100],{"class":236}," signature;\n",[112,19102,19103],{"class":114,"line":315},[112,19104,584],{"class":236},[19,19106,19107],{},"With this setup, your bot can:",[43,19109,19110,19113,19116],{},[46,19111,19112],{},"Receive notifications whenever a new message is sent in the monitored channels",[46,19114,19115],{},"Process those messages through your AI pipeline",[46,19117,19118],{},"Send responses back to the appropriate channel",[19,19120,19121,19122,634],{},"For more details on webhooks at Unified.to, see our ",[1614,19123,19126],{"href":19124,"rel":19125},"https://docs.unified.to/reference/webhooks",[1618],"guide to webhooks",[67,19128,19130],{"id":19129},"send-responses-through-discord","Send responses through Discord",[19,19132,19133],{},"When you're ready to respond to a user's question, use our Messaging API to send the message back to Discord. Here's an example implementation with error handling and message formatting:",[102,19135,19137],{"className":9951,"code":19136,"language":9953,"meta":107,"style":107},"async function sendDiscordResponse(connectionId: string, apiKey: string, channelId: string, response: string) {\n  const formattedResponse = formatDiscordMessage(response);\n\n  const apiResponse = await fetch(\n    `https://api.unified.to/messaging/${connectionId}/message`,\n    {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${apiKey}`,\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        channel_id: channelId,\n        message: formattedResponse,\n        message_html: formattedResponse, // Optional: Use for formatted text\n      })\n    }\n  );\n\n  if (!apiResponse.ok) {\n    if (apiResponse.status === 401) {\n      throw new Error('Authentication failed - check your API key');\n    } else if (apiResponse.status === 404) {\n      throw new Error('Channel not found - verify channel ID');\n    }\n    throw new Error(`Failed to send message: ${apiResponse.statusText}`);\n  }\n\n  return apiResponse.json();\n}\n\nfunction formatDiscordMessage(response) {\n  // Example formatting for Discord markdown\n  return `**Bot Response:**\\n${response}`;\n}\n\n// Example usage with different message types\nasync function sendBotResponses(connectionId, apiKey, channelId) {\n  // Simple text response\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    'Here is the answer to your question...'\n  );\n\n  // Response with code block\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    '```javascript\\nconst example = \"code block\";\\n```'\n  );\n\n  // Response with rich formatting\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    '**Bold text** and *italic text* with a [link](https://example.com)'\n  );\n}\n",[109,19138,19139,19182,19197,19201,19216,19228,19232,19240,19244,19258,19266,19270,19282,19287,19292,19300,19304,19308,19312,19316,19327,19341,19357,19376,19391,19395,19419,19423,19427,19438,19442,19446,19458,19463,19482,19486,19490,19495,19518,19523,19531,19535,19540,19545,19550,19554,19558,19563,19571,19575,19579,19583,19598,19602,19606,19611,19619,19623,19627,19631,19636,19640],{"__ignoreMap":107},[112,19140,19141,19143,19145,19147,19149,19151,19153,19155,19157,19159,19161,19163,19165,19168,19170,19172,19174,19176,19178,19180],{"class":114,"line":115},[112,19142,1377],{"class":229},[112,19144,509],{"class":229},[112,19146,18896],{"class":118},[112,19148,456],{"class":236},[112,19150,518],{"class":517},[112,19152,171],{"class":229},[112,19154,523],{"class":129},[112,19156,1046],{"class":236},[112,19158,17459],{"class":517},[112,19160,171],{"class":229},[112,19162,523],{"class":129},[112,19164,1046],{"class":236},[112,19166,19167],{"class":517},"channelId",[112,19169,171],{"class":229},[112,19171,523],{"class":129},[112,19173,1046],{"class":236},[112,19175,17690],{"class":517},[112,19177,171],{"class":229},[112,19179,523],{"class":129},[112,19181,526],{"class":236},[112,19183,19184,19186,19189,19191,19194],{"class":114,"line":126},[112,19185,531],{"class":229},[112,19187,19188],{"class":129}," formattedResponse",[112,19190,354],{"class":229},[112,19192,19193],{"class":118}," formatDiscordMessage",[112,19195,19196],{"class":236},"(response);\n",[112,19198,19199],{"class":114,"line":135},[112,19200,272],{"emptyLinePlaceholder":271},[112,19202,19203,19205,19208,19210,19212,19214],{"class":114,"line":147},[112,19204,531],{"class":229},[112,19206,19207],{"class":129}," apiResponse",[112,19209,354],{"class":229},[112,19211,539],{"class":229},[112,19213,17607],{"class":118},[112,19215,17610],{"class":236},[112,19217,19218,19221,19223,19226],{"class":114,"line":202},[112,19219,19220],{"class":122},"    `https://api.unified.to/messaging/${",[112,19222,518],{"class":236},[112,19224,19225],{"class":122},"}/message`",[112,19227,288],{"class":236},[112,19229,19230],{"class":114,"line":208},[112,19231,1076],{"class":236},[112,19233,19234,19236,19238],{"class":114,"line":291},[112,19235,18544],{"class":236},[112,19237,18547],{"class":122},[112,19239,288],{"class":236},[112,19241,19242],{"class":114,"line":299},[112,19243,17631],{"class":236},[112,19245,19246,19248,19250,19252,19254,19256],{"class":114,"line":307},[112,19247,18558],{"class":122},[112,19249,2335],{"class":236},[112,19251,14069],{"class":122},[112,19253,17459],{"class":236},[112,19255,640],{"class":122},[112,19257,288],{"class":236},[112,19259,19260,19262,19264],{"class":114,"line":315},[112,19261,18573],{"class":122},[112,19263,2335],{"class":236},[112,19265,18578],{"class":122},[112,19267,19268],{"class":114,"line":323},[112,19269,955],{"class":236},[112,19271,19272,19274,19276,19278,19280],{"class":114,"line":329},[112,19273,18587],{"class":236},[112,19275,13765],{"class":129},[112,19277,634],{"class":236},[112,19279,13770],{"class":118},[112,19281,363],{"class":236},[112,19283,19284],{"class":114,"line":341},[112,19285,19286],{"class":236},"        channel_id: channelId,\n",[112,19288,19289],{"class":114,"line":346},[112,19290,19291],{"class":236},"        message: formattedResponse,\n",[112,19293,19294,19297],{"class":114,"line":366},[112,19295,19296],{"class":236},"        message_html: formattedResponse, ",[112,19298,19299],{"class":578},"// Optional: Use for formatted text\n",[112,19301,19302],{"class":114,"line":381},[112,19303,18628],{"class":236},[112,19305,19306],{"class":114,"line":387},[112,19307,3946],{"class":236},[112,19309,19310],{"class":114,"line":392},[112,19311,10038],{"class":236},[112,19313,19314],{"class":114,"line":409},[112,19315,272],{"emptyLinePlaceholder":271},[112,19317,19318,19320,19322,19324],{"class":114,"line":422},[112,19319,13931],{"class":229},[112,19321,1419],{"class":236},[112,19323,375],{"class":229},[112,19325,19326],{"class":236},"apiResponse.ok) {\n",[112,19328,19329,19331,19334,19336,19339],{"class":114,"line":435},[112,19330,15209],{"class":229},[112,19332,19333],{"class":236}," (apiResponse.status ",[112,19335,14573],{"class":229},[112,19337,19338],{"class":129}," 401",[112,19340,526],{"class":236},[112,19342,19343,19346,19348,19350,19352,19355],{"class":114,"line":440},[112,19344,19345],{"class":229},"      throw",[112,19347,357],{"class":229},[112,19349,17682],{"class":118},[112,19351,456],{"class":236},[112,19353,19354],{"class":122},"'Authentication failed - check your API key'",[112,19356,464],{"class":236},[112,19358,19359,19362,19364,19367,19369,19371,19374],{"class":114,"line":4949},[112,19360,19361],{"class":236},"    } ",[112,19363,14616],{"class":229},[112,19365,19366],{"class":229}," if",[112,19368,19333],{"class":236},[112,19370,14573],{"class":229},[112,19372,19373],{"class":129}," 404",[112,19375,526],{"class":236},[112,19377,19378,19380,19382,19384,19386,19389],{"class":114,"line":4960},[112,19379,19345],{"class":229},[112,19381,357],{"class":229},[112,19383,17682],{"class":118},[112,19385,456],{"class":236},[112,19387,19388],{"class":122},"'Channel not found - verify channel ID'",[112,19390,464],{"class":236},[112,19392,19393],{"class":114,"line":4972},[112,19394,3946],{"class":236},[112,19396,19397,19399,19401,19403,19405,19408,19411,19413,19415,19417],{"class":114,"line":4984},[112,19398,17677],{"class":229},[112,19400,357],{"class":229},[112,19402,17682],{"class":118},[112,19404,456],{"class":236},[112,19406,19407],{"class":122},"`Failed to send message: ${",[112,19409,19410],{"class":236},"apiResponse",[112,19412,634],{"class":122},[112,19414,17695],{"class":236},[112,19416,640],{"class":122},[112,19418,464],{"class":236},[112,19420,19421],{"class":114,"line":4992},[112,19422,1476],{"class":236},[112,19424,19425],{"class":114,"line":5000},[112,19426,272],{"emptyLinePlaceholder":271},[112,19428,19429,19431,19434,19436],{"class":114,"line":5008},[112,19430,621],{"class":229},[112,19432,19433],{"class":236}," apiResponse.",[112,19435,2320],{"class":118},[112,19437,1536],{"class":236},[112,19439,19440],{"class":114,"line":5016},[112,19441,584],{"class":236},[112,19443,19444],{"class":114,"line":5024},[112,19445,272],{"emptyLinePlaceholder":271},[112,19447,19448,19450,19452,19454,19456],{"class":114,"line":5032},[112,19449,9978],{"class":229},[112,19451,19193],{"class":118},[112,19453,456],{"class":236},[112,19455,17690],{"class":517},[112,19457,526],{"class":236},[112,19459,19460],{"class":114,"line":5040},[112,19461,19462],{"class":578},"  // Example formatting for Discord markdown\n",[112,19464,19465,19467,19470,19473,19476,19478,19480],{"class":114,"line":5046},[112,19466,621],{"class":229},[112,19468,19469],{"class":122}," `**Bot Response:**",[112,19471,19472],{"class":129},"\\n",[112,19474,19475],{"class":122},"${",[112,19477,17690],{"class":236},[112,19479,640],{"class":122},[112,19481,237],{"class":236},[112,19483,19484],{"class":114,"line":5052},[112,19485,584],{"class":236},[112,19487,19488],{"class":114,"line":5061},[112,19489,272],{"emptyLinePlaceholder":271},[112,19491,19492],{"class":114,"line":5066},[112,19493,19494],{"class":578},"// Example usage with different message types\n",[112,19496,19497,19499,19501,19504,19506,19508,19510,19512,19514,19516],{"class":114,"line":9217},[112,19498,1377],{"class":229},[112,19500,509],{"class":229},[112,19502,19503],{"class":118}," sendBotResponses",[112,19505,456],{"class":236},[112,19507,518],{"class":517},[112,19509,1046],{"class":236},[112,19511,17459],{"class":517},[112,19513,1046],{"class":236},[112,19515,19167],{"class":517},[112,19517,526],{"class":236},[112,19519,19520],{"class":114,"line":9225},[112,19521,19522],{"class":578},"  // Simple text response\n",[112,19524,19525,19527,19529],{"class":114,"line":9237},[112,19526,1062],{"class":229},[112,19528,18896],{"class":118},[112,19530,17610],{"class":236},[112,19532,19533],{"class":114,"line":9248},[112,19534,552],{"class":236},[112,19536,19537],{"class":114,"line":9253},[112,19538,19539],{"class":236},"    apiKey,\n",[112,19541,19542],{"class":114,"line":9261},[112,19543,19544],{"class":236},"    channelId,\n",[112,19546,19547],{"class":114,"line":9267},[112,19548,19549],{"class":122},"    'Here is the answer to your question...'\n",[112,19551,19552],{"class":114,"line":9272},[112,19553,10038],{"class":236},[112,19555,19556],{"class":114,"line":9280},[112,19557,272],{"emptyLinePlaceholder":271},[112,19559,19560],{"class":114,"line":9293},[112,19561,19562],{"class":578},"  // Response with code block\n",[112,19564,19565,19567,19569],{"class":114,"line":9304},[112,19566,1062],{"class":229},[112,19568,18896],{"class":118},[112,19570,17610],{"class":236},[112,19572,19573],{"class":114,"line":9309},[112,19574,552],{"class":236},[112,19576,19577],{"class":114,"line":9317},[112,19578,19539],{"class":236},[112,19580,19581],{"class":114,"line":9328},[112,19582,19544],{"class":236},[112,19584,19585,19588,19590,19593,19595],{"class":114,"line":9337},[112,19586,19587],{"class":122},"    '```javascript",[112,19589,19472],{"class":129},[112,19591,19592],{"class":122},"const example = \"code block\";",[112,19594,19472],{"class":129},[112,19596,19597],{"class":122},"```'\n",[112,19599,19600],{"class":114,"line":9342},[112,19601,10038],{"class":236},[112,19603,19604],{"class":114,"line":9350},[112,19605,272],{"emptyLinePlaceholder":271},[112,19607,19608],{"class":114,"line":9361},[112,19609,19610],{"class":578},"  // Response with rich formatting\n",[112,19612,19613,19615,19617],{"class":114,"line":9371},[112,19614,1062],{"class":229},[112,19616,18896],{"class":118},[112,19618,17610],{"class":236},[112,19620,19621],{"class":114,"line":9376},[112,19622,552],{"class":236},[112,19624,19625],{"class":114,"line":9384},[112,19626,19539],{"class":236},[112,19628,19629],{"class":114,"line":9396},[112,19630,19544],{"class":236},[112,19632,19633],{"class":114,"line":9405},[112,19634,19635],{"class":122},"    '**Bold text** and *italic text* with a [link](https://example.com)'\n",[112,19637,19638],{"class":114,"line":9410},[112,19639,10038],{"class":236},[112,19641,19642],{"class":114,"line":9422},[112,19643,584],{"class":236},[19,19645,19646,2335,19648],{},[478,19647,17920],{},[1614,19649,13321],{"href":19650,"rel":19651},"https://docs.unified.to/messaging/overview",[1618],[67,19653,19655],{"id":19654},"putting-it-all-together","Putting it all together",[19,19657,19658],{},"Here's a high-level overview of how to combine all the components into a working support bot:",[102,19660,19662],{"className":220,"code":19661,"language":222,"meta":107,"style":107},"import { Langbase } from 'langbase';\n\nasync function initializeSupportBot() {\n    // Initialize APIs\n  const langbase = new Langbase({\n    apiKey: process.env.LANGBASE_API_KEY!\n  });\n\n    // Get connection IDs - implement these based on how you manage your users\n  const KMS_CONNECTION_ID = await getKMSConnection(user_id);\n  const DISCORD_CONNECTION_ID = await getDiscordConnection(user_id);\n  const UNIFIED_API_KEY = process.env.UNIFIED_API_KEY;\n\n    // Step 1: Fetch content from KMS\n  const kmsContent = await fetchContent(KMS_CONNECTION_ID, UNIFIED_API_KEY);\n\n    // Step 2: Set up Langbase Memory and upload content\n  const memory = await langbase.memory.create({\n    name: `support-kb-${user_id}`,\n    description: 'Knowledge base for support bot'\n  });\n\n  await uploadContentToMemory(kmsContent, memory.name);\n\n    // Step 3: Create an AI agent using Langbase Pipe\n  const pipe = await langbase.pipe.create({\n    name: `discord-support-bot`,\n    type: 'chat',\n    memory: memory.name,\n    description: 'Support bot powered by our knowledge base'\n  });\n\n    // Step 4: Set up Discord webhook for real-time messages\n  const webhook = await createDiscordWebhook(\n    DISCORD_CONNECTION_ID,\n    UNIFIED_API_KEY,\n    'https://your-server.com/webhook'\n  );\n\n    // Step 5: Handle incoming questions\n  async function handleQuestion(channelId: string, question: string) {\n    try {\n            // Use the Pipe to generate a response\n      const response = await langbase.pipe.chat({\n        pipe: pipe.name,\n        messages: [{ role: 'user', content: question }]\n      });\n\n            // Send the response back to Discord\n      await sendDiscordResponse(\n        DISCORD_CONNECTION_ID,\n        UNIFIED_API_KEY,\n        channelId,\n        response.message\n      );\n    } catch (error) {\n      console.error('Error handling question:', error);\n    }\n  }\n\n  return {\n    memory,\n    pipe,\n    webhook,\n    handleQuestion\n  };\n}\n\n// Usage example\nasync function startBot() {\n  const bot = await initializeSupportBot();\n\n    // Your webhook endpoint would call this when receiving messages\n  app.post('/webhook', async (req, res) => {\n    const { data, webhook, nonce, sig } = req.body;\n\n        // Handle new messages\n    for (const message of data) {\n            // Ignore messages from the bot itself\n      if (message.author_member.id === BOT_USER_ID) continue;\n\n      await bot.handleQuestion(message.channel_id, message.message);\n    }\n\n    res.sendStatus(200);\n  });\n}\n",[109,19663,19664,19676,19680,19691,19696,19710,19720,19724,19728,19733,19750,19766,19782,19786,19791,19815,19819,19824,19840,19853,19860,19864,19868,19877,19881,19886,19902,19911,19919,19924,19930,19934,19938,19943,19958,19965,19972,19977,19981,19985,19990,20019,20026,20031,20049,20054,20065,20070,20074,20079,20088,20095,20102,20107,20112,20117,20127,20143,20147,20151,20155,20161,20166,20171,20176,20181,20186,20190,20194,20199,20210,20225,20230,20236,20266,20293,20298,20304,20320,20326,20344,20349,20363,20368,20373,20387,20392],{"__ignoreMap":107},[112,19665,19666,19668,19670,19672,19674],{"class":114,"line":115},[112,19667,230],{"class":229},[112,19669,17981],{"class":236},[112,19671,247],{"class":229},[112,19673,17986],{"class":122},[112,19675,237],{"class":236},[112,19677,19678],{"class":114,"line":126},[112,19679,272],{"emptyLinePlaceholder":271},[112,19681,19682,19684,19686,19689],{"class":114,"line":135},[112,19683,1377],{"class":229},[112,19685,509],{"class":229},[112,19687,19688],{"class":118}," initializeSupportBot",[112,19690,1385],{"class":236},[112,19692,19693],{"class":114,"line":147},[112,19694,19695],{"class":578},"    // Initialize APIs\n",[112,19697,19698,19700,19702,19704,19706,19708],{"class":114,"line":202},[112,19699,531],{"class":229},[112,19701,17999],{"class":129},[112,19703,354],{"class":229},[112,19705,357],{"class":229},[112,19707,1762],{"class":118},[112,19709,363],{"class":236},[112,19711,19712,19715,19717],{"class":114,"line":208},[112,19713,19714],{"class":236},"    apiKey: process.env.",[112,19716,18015],{"class":129},[112,19718,19719],{"class":229},"!\n",[112,19721,19722],{"class":114,"line":291},[112,19723,567],{"class":236},[112,19725,19726],{"class":114,"line":299},[112,19727,272],{"emptyLinePlaceholder":271},[112,19729,19730],{"class":114,"line":307},[112,19731,19732],{"class":578},"    // Get connection IDs - implement these based on how you manage your users\n",[112,19734,19735,19737,19740,19742,19744,19747],{"class":114,"line":315},[112,19736,531],{"class":229},[112,19738,19739],{"class":129}," KMS_CONNECTION_ID",[112,19741,354],{"class":229},[112,19743,539],{"class":229},[112,19745,19746],{"class":118}," getKMSConnection",[112,19748,19749],{"class":236},"(user_id);\n",[112,19751,19752,19754,19757,19759,19761,19764],{"class":114,"line":323},[112,19753,531],{"class":229},[112,19755,19756],{"class":129}," DISCORD_CONNECTION_ID",[112,19758,354],{"class":229},[112,19760,539],{"class":229},[112,19762,19763],{"class":118}," getDiscordConnection",[112,19765,19749],{"class":236},[112,19767,19768,19770,19773,19775,19778,19780],{"class":114,"line":329},[112,19769,531],{"class":229},[112,19771,19772],{"class":129}," UNIFIED_API_KEY",[112,19774,354],{"class":229},[112,19776,19777],{"class":236}," process.env.",[112,19779,372],{"class":129},[112,19781,237],{"class":236},[112,19783,19784],{"class":114,"line":341},[112,19785,272],{"emptyLinePlaceholder":271},[112,19787,19788],{"class":114,"line":346},[112,19789,19790],{"class":578},"    // Step 1: Fetch content from KMS\n",[112,19792,19793,19795,19798,19800,19802,19804,19806,19809,19811,19813],{"class":114,"line":366},[112,19794,531],{"class":229},[112,19796,19797],{"class":129}," kmsContent",[112,19799,354],{"class":229},[112,19801,539],{"class":229},[112,19803,17446],{"class":118},[112,19805,456],{"class":236},[112,19807,19808],{"class":129},"KMS_CONNECTION_ID",[112,19810,1046],{"class":236},[112,19812,372],{"class":129},[112,19814,464],{"class":236},[112,19816,19817],{"class":114,"line":381},[112,19818,272],{"emptyLinePlaceholder":271},[112,19820,19821],{"class":114,"line":387},[112,19822,19823],{"class":578},"    // Step 2: Set up Langbase Memory and upload content\n",[112,19825,19826,19828,19830,19832,19834,19836,19838],{"class":114,"line":392},[112,19827,531],{"class":229},[112,19829,18050],{"class":129},[112,19831,354],{"class":229},[112,19833,539],{"class":229},[112,19835,18057],{"class":236},[112,19837,18060],{"class":118},[112,19839,363],{"class":236},[112,19841,19842,19844,19847,19849,19851],{"class":114,"line":409},[112,19843,18067],{"class":236},[112,19845,19846],{"class":122},"`support-kb-${",[112,19848,12980],{"class":236},[112,19850,640],{"class":122},[112,19852,288],{"class":236},[112,19854,19855,19857],{"class":114,"line":422},[112,19856,18077],{"class":236},[112,19858,19859],{"class":122},"'Knowledge base for support bot'\n",[112,19861,19862],{"class":114,"line":435},[112,19863,567],{"class":236},[112,19865,19866],{"class":114,"line":440},[112,19867,272],{"emptyLinePlaceholder":271},[112,19869,19870,19872,19874],{"class":114,"line":4949},[112,19871,1062],{"class":229},[112,19873,18139],{"class":118},[112,19875,19876],{"class":236},"(kmsContent, memory.name);\n",[112,19878,19879],{"class":114,"line":4960},[112,19880,272],{"emptyLinePlaceholder":271},[112,19882,19883],{"class":114,"line":4972},[112,19884,19885],{"class":578},"    // Step 3: Create an AI agent using Langbase Pipe\n",[112,19887,19888,19890,19892,19894,19896,19898,19900],{"class":114,"line":4984},[112,19889,531],{"class":229},[112,19891,18388],{"class":129},[112,19893,354],{"class":229},[112,19895,539],{"class":229},[112,19897,18395],{"class":236},[112,19899,18060],{"class":118},[112,19901,363],{"class":236},[112,19903,19904,19906,19909],{"class":114,"line":4992},[112,19905,18067],{"class":236},[112,19907,19908],{"class":122},"`discord-support-bot`",[112,19910,288],{"class":236},[112,19912,19913,19915,19917],{"class":114,"line":5000},[112,19914,18413],{"class":236},[112,19916,18416],{"class":122},[112,19918,288],{"class":236},[112,19920,19921],{"class":114,"line":5008},[112,19922,19923],{"class":236},"    memory: memory.name,\n",[112,19925,19926,19928],{"class":114,"line":5016},[112,19927,18077],{"class":236},[112,19929,18430],{"class":122},[112,19931,19932],{"class":114,"line":5024},[112,19933,567],{"class":236},[112,19935,19936],{"class":114,"line":5032},[112,19937,272],{"emptyLinePlaceholder":271},[112,19939,19940],{"class":114,"line":5040},[112,19941,19942],{"class":578},"    // Step 4: Set up Discord webhook for real-time messages\n",[112,19944,19945,19947,19950,19952,19954,19956],{"class":114,"line":5046},[112,19946,531],{"class":229},[112,19948,19949],{"class":129}," webhook",[112,19951,354],{"class":229},[112,19953,539],{"class":229},[112,19955,18487],{"class":118},[112,19957,17610],{"class":236},[112,19959,19960,19963],{"class":114,"line":5052},[112,19961,19962],{"class":129},"    DISCORD_CONNECTION_ID",[112,19964,288],{"class":236},[112,19966,19967,19970],{"class":114,"line":5061},[112,19968,19969],{"class":129},"    UNIFIED_API_KEY",[112,19971,288],{"class":236},[112,19973,19974],{"class":114,"line":5066},[112,19975,19976],{"class":122},"    'https://your-server.com/webhook'\n",[112,19978,19979],{"class":114,"line":9217},[112,19980,10038],{"class":236},[112,19982,19983],{"class":114,"line":9225},[112,19984,272],{"emptyLinePlaceholder":271},[112,19986,19987],{"class":114,"line":9237},[112,19988,19989],{"class":578},"    // Step 5: Handle incoming questions\n",[112,19991,19992,19995,19997,20000,20002,20004,20006,20008,20010,20013,20015,20017],{"class":114,"line":9248},[112,19993,19994],{"class":229},"  async",[112,19996,509],{"class":229},[112,19998,19999],{"class":118}," handleQuestion",[112,20001,456],{"class":236},[112,20003,19167],{"class":517},[112,20005,171],{"class":229},[112,20007,523],{"class":129},[112,20009,1046],{"class":236},[112,20011,20012],{"class":517},"question",[112,20014,171],{"class":229},[112,20016,523],{"class":129},[112,20018,526],{"class":236},[112,20020,20021,20024],{"class":114,"line":9253},[112,20022,20023],{"class":229},"    try",[112,20025,280],{"class":236},[112,20027,20028],{"class":114,"line":9261},[112,20029,20030],{"class":578},"            // Use the Pipe to generate a response\n",[112,20032,20033,20036,20038,20040,20042,20044,20047],{"class":114,"line":9267},[112,20034,20035],{"class":229},"      const",[112,20037,17600],{"class":129},[112,20039,354],{"class":229},[112,20041,539],{"class":229},[112,20043,18395],{"class":236},[112,20045,20046],{"class":118},"chat",[112,20048,363],{"class":236},[112,20050,20051],{"class":114,"line":9272},[112,20052,20053],{"class":236},"        pipe: pipe.name,\n",[112,20055,20056,20059,20062],{"class":114,"line":9280},[112,20057,20058],{"class":236},"        messages: [{ role: ",[112,20060,20061],{"class":122},"'user'",[112,20063,20064],{"class":236},", content: question }]\n",[112,20066,20067],{"class":114,"line":9293},[112,20068,20069],{"class":236},"      });\n",[112,20071,20072],{"class":114,"line":9304},[112,20073,272],{"emptyLinePlaceholder":271},[112,20075,20076],{"class":114,"line":9309},[112,20077,20078],{"class":578},"            // Send the response back to Discord\n",[112,20080,20081,20084,20086],{"class":114,"line":9317},[112,20082,20083],{"class":229},"      await",[112,20085,18896],{"class":118},[112,20087,17610],{"class":236},[112,20089,20090,20093],{"class":114,"line":9328},[112,20091,20092],{"class":129},"        DISCORD_CONNECTION_ID",[112,20094,288],{"class":236},[112,20096,20097,20100],{"class":114,"line":9337},[112,20098,20099],{"class":129},"        UNIFIED_API_KEY",[112,20101,288],{"class":236},[112,20103,20104],{"class":114,"line":9342},[112,20105,20106],{"class":236},"        channelId,\n",[112,20108,20109],{"class":114,"line":9350},[112,20110,20111],{"class":236},"        response.message\n",[112,20113,20114],{"class":114,"line":9361},[112,20115,20116],{"class":236},"      );\n",[112,20118,20119,20121,20124],{"class":114,"line":9371},[112,20120,19361],{"class":236},[112,20122,20123],{"class":229},"catch",[112,20125,20126],{"class":236}," (error) {\n",[112,20128,20129,20132,20135,20137,20140],{"class":114,"line":9376},[112,20130,20131],{"class":236},"      console.",[112,20133,20134],{"class":118},"error",[112,20136,456],{"class":236},[112,20138,20139],{"class":122},"'Error handling question:'",[112,20141,20142],{"class":236},", error);\n",[112,20144,20145],{"class":114,"line":9384},[112,20146,3946],{"class":236},[112,20148,20149],{"class":114,"line":9396},[112,20150,1476],{"class":236},[112,20152,20153],{"class":114,"line":9405},[112,20154,272],{"emptyLinePlaceholder":271},[112,20156,20157,20159],{"class":114,"line":9410},[112,20158,621],{"class":229},[112,20160,280],{"class":236},[112,20162,20163],{"class":114,"line":9422},[112,20164,20165],{"class":236},"    memory,\n",[112,20167,20168],{"class":114,"line":9434},[112,20169,20170],{"class":236},"    pipe,\n",[112,20172,20173],{"class":114,"line":9447},[112,20174,20175],{"class":236},"    webhook,\n",[112,20177,20178],{"class":114,"line":9459},[112,20179,20180],{"class":236},"    handleQuestion\n",[112,20182,20183],{"class":114,"line":9472},[112,20184,20185],{"class":236},"  };\n",[112,20187,20188],{"class":114,"line":9485},[112,20189,584],{"class":236},[112,20191,20192],{"class":114,"line":9498},[112,20193,272],{"emptyLinePlaceholder":271},[112,20195,20196],{"class":114,"line":9509},[112,20197,20198],{"class":578},"// Usage example\n",[112,20200,20201,20203,20205,20208],{"class":114,"line":9515},[112,20202,1377],{"class":229},[112,20204,509],{"class":229},[112,20206,20207],{"class":118}," startBot",[112,20209,1385],{"class":236},[112,20211,20212,20214,20217,20219,20221,20223],{"class":114,"line":9524},[112,20213,531],{"class":229},[112,20215,20216],{"class":129}," bot",[112,20218,354],{"class":229},[112,20220,539],{"class":229},[112,20222,19688],{"class":118},[112,20224,1536],{"class":236},[112,20226,20228],{"class":114,"line":20227},72,[112,20229,272],{"emptyLinePlaceholder":271},[112,20231,20233],{"class":114,"line":20232},73,[112,20234,20235],{"class":578},"    // Your webhook endpoint would call this when receiving messages\n",[112,20237,20239,20242,20244,20246,20248,20250,20252,20254,20256,20258,20260,20262,20264],{"class":114,"line":20238},74,[112,20240,20241],{"class":236},"  app.",[112,20243,18745],{"class":118},[112,20245,456],{"class":236},[112,20247,18750],{"class":122},[112,20249,1046],{"class":236},[112,20251,1377],{"class":229},[112,20253,1419],{"class":236},[112,20255,13850],{"class":517},[112,20257,1046],{"class":236},[112,20259,13855],{"class":517},[112,20261,745],{"class":236},[112,20263,748],{"class":229},[112,20265,280],{"class":236},[112,20267,20269,20271,20273,20275,20277,20279,20281,20283,20285,20287,20289,20291],{"class":114,"line":20268},75,[112,20270,1435],{"class":229},[112,20272,18780],{"class":236},[112,20274,18783],{"class":129},[112,20276,1046],{"class":236},[112,20278,18788],{"class":129},[112,20280,1046],{"class":236},[112,20282,18793],{"class":129},[112,20284,1046],{"class":236},[112,20286,18798],{"class":129},[112,20288,18801],{"class":236},[112,20290,335],{"class":229},[112,20292,18806],{"class":236},[112,20294,20296],{"class":114,"line":20295},76,[112,20297,272],{"emptyLinePlaceholder":271},[112,20299,20301],{"class":114,"line":20300},77,[112,20302,20303],{"class":578},"        // Handle new messages\n",[112,20305,20307,20310,20312,20314,20316,20318],{"class":114,"line":20306},78,[112,20308,20309],{"class":229},"    for",[112,20311,1419],{"class":236},[112,20313,277],{"class":229},[112,20315,18826],{"class":129},[112,20317,1427],{"class":229},[112,20319,18831],{"class":236},[112,20321,20323],{"class":114,"line":20322},79,[112,20324,20325],{"class":578},"            // Ignore messages from the bot itself\n",[112,20327,20329,20332,20334,20336,20338,20340,20342],{"class":114,"line":20328},80,[112,20330,20331],{"class":229},"      if",[112,20333,18843],{"class":236},[112,20335,14573],{"class":229},[112,20337,18848],{"class":129},[112,20339,745],{"class":236},[112,20341,18853],{"class":229},[112,20343,237],{"class":236},[112,20345,20347],{"class":114,"line":20346},81,[112,20348,272],{"emptyLinePlaceholder":271},[112,20350,20352,20354,20357,20360],{"class":114,"line":20351},82,[112,20353,20083],{"class":229},[112,20355,20356],{"class":236}," bot.",[112,20358,20359],{"class":118},"handleQuestion",[112,20361,20362],{"class":236},"(message.channel_id, message.message);\n",[112,20364,20366],{"class":114,"line":20365},83,[112,20367,3946],{"class":236},[112,20369,20371],{"class":114,"line":20370},84,[112,20372,272],{"emptyLinePlaceholder":271},[112,20374,20376,20379,20381,20383,20385],{"class":114,"line":20375},85,[112,20377,20378],{"class":236},"    res.",[112,20380,18943],{"class":118},[112,20382,456],{"class":236},[112,20384,18948],{"class":129},[112,20386,464],{"class":236},[112,20388,20390],{"class":114,"line":20389},86,[112,20391,567],{"class":236},[112,20393,20395],{"class":114,"line":20394},87,[112,20396,584],{"class":236},[19,20398,20399],{},"This implementation:",[43,20401,20402,20405,20408,20411],{},[46,20403,20404],{},"Initializes both Unified.to and Langbase clients",[46,20406,20407],{},"Creates a Memory AGent to store your knowledge base content",[46,20409,20410],{},"Sets up a Pipe to handle natural language interactions",[46,20412,20413],{},"Configures Discord webhooks for real-time messaging",[19,20415,20416],{},"The bot will now:",[72,20418,20419,20422,20425],{},[46,20420,20421],{},"Automatically receive messages from Discord through webhooks",[46,20423,20424],{},"Process questions using your knowledge base through Langbase Pipes",[46,20426,20427],{},"Send responses back to the appropriate Discord channel",[19,20429,20430],{},"All of this happens with minimal infrastructure management on your part - Unified.to handles the integrations while Langbase manages the AI components.",[67,20432,16927],{"id":16926},[19,20434,20435],{},"Congratulations! You've built a powerful support bot by combining Unified.to's integration capabilities with Langbase's AI features. In this guide, you learned how to:",[72,20437,20438,20441,20444,20446],{},[46,20439,20440],{},"Pull knowledge base content from any system using Unified.to's KMS API",[46,20442,20443],{},"Process and embed that content using Langbase Memory Agents",[46,20445,17029],{},[46,20447,20448],{},"Handle real-time messages through Discord using Unified.to's Messaging API and webhooks",[19,20450,20451],{},"As an added bonus, this architecture is incredibly flexible. Since you're using Unified.to's APIs, you can easily expand your knowledge sources - want to pull content from Confluence instead of Notion? Or deploy your bot on Slack? It's just a matter of changing the connection - your core logic stays the same.",[19,20453,20454],{},"And with Langbase handling the AI components, you can enhance your bot's capabilities without managing complex infrastructure:",[72,20456,20457,20460,20463],{},[46,20458,20459],{},"Experiment with multiple Memory Agents for different types of content",[46,20461,20462],{},"Customize your Pipe's behaviour through prompt engineering",[46,20464,20465],{},"Scale your bot without worrying about vector store management",[19,20467,20468],{},"Happy building!",[1558,20470,20471],{},"html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}",{"title":107,"searchDepth":126,"depth":126,"links":20473},[20474,20475,20476,20481,20482,20483,20484,20485,20486],{"id":9689,"depth":126,"text":9690},{"id":13633,"depth":126,"text":13634},{"id":17085,"depth":126,"text":17086,"children":20477},[20478,20479,20480],{"id":17106,"depth":135,"text":17107},{"id":17146,"depth":135,"text":17147},{"id":17191,"depth":135,"text":17192},{"id":17425,"depth":126,"text":17426},{"id":17938,"depth":126,"text":17939},{"id":18464,"depth":126,"text":18465},{"id":19129,"depth":126,"text":19130},{"id":19654,"depth":126,"text":19655},{"id":16926,"depth":126,"text":16927},{"img":20488,"date":20489,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_discord_support_bot_with_unified_and_langbase-icon.png","2024-12-12T00:00:00.000Z","/guides/how_to_build_a_discord_support_bot_with_unified_and_langbase",{"title":16992,"description":17007},"guides/how_to_build_a_discord_support_bot_with_unified_and_langbase","Yk7CZE3d6f6w0wN3Etk8JQbmUp_4BV8_YZz9abPrpX8",{"id":20495,"title":20496,"body":20497,"description":21620,"extension":1576,"meta":21621,"navigation":271,"path":21624,"seo":21625,"stem":21626,"__hash__":21627},"guides/guides/how_to_build_a_fintech_application_with_unified_payments_api.md","How to Build a Fintech Application with Unified's Payments API",{"type":9,"value":20498,"toc":21608},[20499,20502,20504,20509,20513,20516,20519,20522,20529,20531,20533,20545,20547,20549,20552,20589,20593,20607,20609,20613,20693,20695,20697,20700,20703,20707,20782,20784,20788,20967,20969,20973,21048,21050,21054,21129,21131,21135,21210,21212,21216,21219,21601,21603,21606],[12,20500,20496],{"id":20501},"how-to-build-a-fintech-application-with-unifieds-payments-api",[16,20503],{},[19,20505,20506],{},[22,20507,20508],{},"September 9, 2025",[12,20510,20512],{"id":20511},"introduction","Introduction",[19,20514,20515],{},"With Unified, you can build fin-tech products that work with your end customers payment providers. With a single integration you can connect payment processors like Stripe, PayPal, GoCardless and more!",[19,20517,20518],{},"You can do various things such as creating payments, generating payment links, manage payouts and even handle refunds - all without building custom connectors for each payment provider.",[19,20520,20521],{},"In this guide, we will show you how to create and list payments as well as some related data. For the example we will be using Stripe, but this approach works for any of the payment integrations supported by Unified.",[19,20523,20524],{},[1614,20525,20528],{"href":20526,"rel":20527},"https://docs.unified.to/payment/integrations",[1618],"See the full list of supported payment integrations.",[16,20530],{},[67,20532,70],{"id":69},[72,20534,20535,20537,20540,20542],{},[46,20536,76],{},[46,20538,20539],{},"Unified account with a payment integration enabled (e.g., Stripe)",[46,20541,82],{},[46,20543,20544],{},"Your customer's payment processor connection ID",[16,20546],{},[67,20548,97],{"id":96},[19,20550,20551],{},"Set up your dependencies",[102,20553,20555],{"className":104,"code":20554,"language":106,"meta":107,"style":107},"mkdir payments-demo\ncd payments-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[109,20556,20557,20564,20570,20578],{"__ignoreMap":107},[112,20558,20559,20561],{"class":114,"line":115},[112,20560,119],{"class":118},[112,20562,20563],{"class":122}," payments-demo\n",[112,20565,20566,20568],{"class":114,"line":126},[112,20567,130],{"class":129},[112,20569,20563],{"class":122},[112,20571,20572,20574,20576],{"class":114,"line":135},[112,20573,138],{"class":118},[112,20575,141],{"class":122},[112,20577,144],{"class":129},[112,20579,20580,20582,20584,20586],{"class":114,"line":147},[112,20581,138],{"class":118},[112,20583,152],{"class":122},[112,20585,155],{"class":122},[112,20587,20588],{"class":122}," dotenv\n",[19,20590,167,20591,171],{},[109,20592,170],{},[102,20594,20596],{"className":174,"code":20595,"language":176,"meta":177,"style":107},"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_STRIPE=your_customer_stripe_connection_id\n",[109,20597,20598,20602],{"__ignoreMap":107},[112,20599,20600],{"class":114,"line":115},[112,20601,184],{},[112,20603,20604],{"class":114,"line":126},[112,20605,20606],{},"CONNECTION_STRIPE=your_customer_stripe_connection_id\n",[16,20608],{},[67,20610,20612],{"id":20611},"step-2-initialize-the-sdk","Step 2: Initialize the SDK",[102,20614,20616],{"className":220,"code":20615,"language":222,"meta":107,"style":107},"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_STRIPE } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[109,20617,20618,20626,20638,20642,20661,20665,20679,20689],{"__ignoreMap":107},[112,20619,20620,20622,20624],{"class":114,"line":115},[112,20621,230],{"class":229},[112,20623,233],{"class":122},[112,20625,237],{"class":236},[112,20627,20628,20630,20632,20634,20636],{"class":114,"line":126},[112,20629,230],{"class":229},[112,20631,244],{"class":236},[112,20633,247],{"class":229},[112,20635,250],{"class":122},[112,20637,237],{"class":236},[112,20639,20640],{"class":114,"line":135},[112,20641,272],{"emptyLinePlaceholder":271},[112,20643,20644,20646,20648,20650,20652,20655,20657,20659],{"class":114,"line":147},[112,20645,277],{"class":229},[112,20647,18780],{"class":236},[112,20649,372],{"class":129},[112,20651,1046],{"class":236},[112,20653,20654],{"class":129},"CONNECTION_STRIPE",[112,20656,18801],{"class":236},[112,20658,335],{"class":229},[112,20660,338],{"class":236},[112,20662,20663],{"class":114,"line":202},[112,20664,272],{"emptyLinePlaceholder":271},[112,20666,20667,20669,20671,20673,20675,20677],{"class":114,"line":208},[112,20668,277],{"class":229},[112,20670,351],{"class":129},[112,20672,354],{"class":229},[112,20674,357],{"class":229},[112,20676,360],{"class":118},[112,20678,363],{"class":236},[112,20680,20681,20683,20685,20687],{"class":114,"line":291},[112,20682,369],{"class":236},[112,20684,372],{"class":129},[112,20686,375],{"class":229},[112,20688,378],{"class":236},[112,20690,20691],{"class":114,"line":299},[112,20692,384],{"class":236},[16,20694],{},[67,20696,470],{"id":469},[19,20698,20699],{},"Before you can list payments, your customer must authorize your app to access their payment provider via Unified's embedded auth flow.",[19,20701,20702],{},"Once authorized, you'll receive a connection ID for each integrations.",[67,20704,20706],{"id":20705},"step-4-listing-payments","Step 4: Listing Payments",[102,20708,20710],{"className":220,"code":20709,"language":222,"meta":107,"style":107},"export async function listPayments(connectionId: string) {\n  const payments = await sdk.payment.listPaymentPayments({\n    connectionId,\n    limit: 10,\n  });\n  return payments; // PaymentPayment[]\n}\n",[109,20711,20712,20733,20752,20756,20764,20768,20778],{"__ignoreMap":107},[112,20713,20714,20716,20718,20720,20723,20725,20727,20729,20731],{"class":114,"line":115},[112,20715,503],{"class":229},[112,20717,506],{"class":229},[112,20719,509],{"class":229},[112,20721,20722],{"class":118}," listPayments",[112,20724,456],{"class":236},[112,20726,518],{"class":517},[112,20728,171],{"class":229},[112,20730,523],{"class":129},[112,20732,526],{"class":236},[112,20734,20735,20737,20740,20742,20744,20747,20750],{"class":114,"line":126},[112,20736,531],{"class":229},[112,20738,20739],{"class":129}," payments",[112,20741,354],{"class":229},[112,20743,539],{"class":229},[112,20745,20746],{"class":236}," sdk.payment.",[112,20748,20749],{"class":118},"listPaymentPayments",[112,20751,363],{"class":236},[112,20753,20754],{"class":114,"line":135},[112,20755,552],{"class":236},[112,20757,20758,20760,20762],{"class":114,"line":147},[112,20759,557],{"class":236},[112,20761,560],{"class":129},[112,20763,288],{"class":236},[112,20765,20766],{"class":114,"line":202},[112,20767,567],{"class":236},[112,20769,20770,20772,20775],{"class":114,"line":208},[112,20771,621],{"class":229},[112,20773,20774],{"class":236}," payments; ",[112,20776,20777],{"class":578},"// PaymentPayment[]\n",[112,20779,20780],{"class":114,"line":291},[112,20781,584],{"class":236},[16,20783],{},[67,20785,20787],{"id":20786},"step-5-creating-a-payment-link","Step 5: Creating a Payment Link",[102,20789,20791],{"className":220,"code":20790,"language":222,"meta":107,"style":107},"export async function createPaymentLink(connectionId: string, amount: number, currency: string) {\n  const link = await sdk.link.createPaymentLink({\n    connectionId,\n    paymentLink: {\n      amount,\n      currency,\n      isActive: true,\n      successUrl: \"\u003Chttps://example.com/success>\",\n      // Stripe typically requires line items on links\n      lineitems: [\n        {\n          itemName: \"Order #123\",\n          unitAmount: amount,\n          unitQuantity: 1,\n          itemSku: \"SKU-123\",\n        },\n      ],\n    },\n  });\n  return link; // PaymentLink\n}\n",[109,20792,20793,20832,20851,20855,20860,20865,20870,20879,20889,20894,20899,20903,20913,20918,20927,20937,20941,20945,20949,20953,20963],{"__ignoreMap":107},[112,20794,20795,20797,20799,20801,20804,20806,20808,20810,20812,20814,20817,20819,20821,20823,20826,20828,20830],{"class":114,"line":115},[112,20796,503],{"class":229},[112,20798,506],{"class":229},[112,20800,509],{"class":229},[112,20802,20803],{"class":118}," createPaymentLink",[112,20805,456],{"class":236},[112,20807,518],{"class":517},[112,20809,171],{"class":229},[112,20811,523],{"class":129},[112,20813,1046],{"class":236},[112,20815,20816],{"class":517},"amount",[112,20818,171],{"class":229},[112,20820,1054],{"class":129},[112,20822,1046],{"class":236},[112,20824,20825],{"class":517},"currency",[112,20827,171],{"class":229},[112,20829,523],{"class":129},[112,20831,526],{"class":236},[112,20833,20834,20836,20839,20841,20843,20846,20849],{"class":114,"line":126},[112,20835,531],{"class":229},[112,20837,20838],{"class":129}," link",[112,20840,354],{"class":229},[112,20842,539],{"class":229},[112,20844,20845],{"class":236}," sdk.link.",[112,20847,20848],{"class":118},"createPaymentLink",[112,20850,363],{"class":236},[112,20852,20853],{"class":114,"line":135},[112,20854,552],{"class":236},[112,20856,20857],{"class":114,"line":147},[112,20858,20859],{"class":236},"    paymentLink: {\n",[112,20861,20862],{"class":114,"line":202},[112,20863,20864],{"class":236},"      amount,\n",[112,20866,20867],{"class":114,"line":208},[112,20868,20869],{"class":236},"      currency,\n",[112,20871,20872,20875,20877],{"class":114,"line":291},[112,20873,20874],{"class":236},"      isActive: ",[112,20876,1340],{"class":129},[112,20878,288],{"class":236},[112,20880,20881,20884,20887],{"class":114,"line":299},[112,20882,20883],{"class":236},"      successUrl: ",[112,20885,20886],{"class":122},"\"\u003Chttps://example.com/success>\"",[112,20888,288],{"class":236},[112,20890,20891],{"class":114,"line":307},[112,20892,20893],{"class":578},"      // Stripe typically requires line items on links\n",[112,20895,20896],{"class":114,"line":315},[112,20897,20898],{"class":236},"      lineitems: [\n",[112,20900,20901],{"class":114,"line":323},[112,20902,4001],{"class":236},[112,20904,20905,20908,20911],{"class":114,"line":329},[112,20906,20907],{"class":236},"          itemName: ",[112,20909,20910],{"class":122},"\"Order #123\"",[112,20912,288],{"class":236},[112,20914,20915],{"class":114,"line":341},[112,20916,20917],{"class":236},"          unitAmount: amount,\n",[112,20919,20920,20923,20925],{"class":114,"line":346},[112,20921,20922],{"class":236},"          unitQuantity: ",[112,20924,9165],{"class":129},[112,20926,288],{"class":236},[112,20928,20929,20932,20935],{"class":114,"line":366},[112,20930,20931],{"class":236},"          itemSku: ",[112,20933,20934],{"class":122},"\"SKU-123\"",[112,20936,288],{"class":236},[112,20938,20939],{"class":114,"line":381},[112,20940,4803],{"class":236},[112,20942,20943],{"class":114,"line":387},[112,20944,4450],{"class":236},[112,20946,20947],{"class":114,"line":392},[112,20948,988],{"class":236},[112,20950,20951],{"class":114,"line":409},[112,20952,567],{"class":236},[112,20954,20955,20957,20960],{"class":114,"line":422},[112,20956,621],{"class":229},[112,20958,20959],{"class":236}," link; ",[112,20961,20962],{"class":578},"// PaymentLink\n",[112,20964,20965],{"class":114,"line":435},[112,20966,584],{"class":236},[16,20968],{},[67,20970,20972],{"id":20971},"step-6-listing-refunds","Step 6: Listing Refunds",[102,20974,20976],{"className":220,"code":20975,"language":222,"meta":107,"style":107},"export async function listRefunds(connectionId: string) {\n  const refunds = await sdk.refund.listPaymentRefunds({\n    connectionId,\n    limit: 10,\n  });\n  return refunds; // PaymentRefund[]\n}\n",[109,20977,20978,20999,21018,21022,21030,21034,21044],{"__ignoreMap":107},[112,20979,20980,20982,20984,20986,20989,20991,20993,20995,20997],{"class":114,"line":115},[112,20981,503],{"class":229},[112,20983,506],{"class":229},[112,20985,509],{"class":229},[112,20987,20988],{"class":118}," listRefunds",[112,20990,456],{"class":236},[112,20992,518],{"class":517},[112,20994,171],{"class":229},[112,20996,523],{"class":129},[112,20998,526],{"class":236},[112,21000,21001,21003,21006,21008,21010,21013,21016],{"class":114,"line":126},[112,21002,531],{"class":229},[112,21004,21005],{"class":129}," refunds",[112,21007,354],{"class":229},[112,21009,539],{"class":229},[112,21011,21012],{"class":236}," sdk.refund.",[112,21014,21015],{"class":118},"listPaymentRefunds",[112,21017,363],{"class":236},[112,21019,21020],{"class":114,"line":135},[112,21021,552],{"class":236},[112,21023,21024,21026,21028],{"class":114,"line":147},[112,21025,557],{"class":236},[112,21027,560],{"class":129},[112,21029,288],{"class":236},[112,21031,21032],{"class":114,"line":202},[112,21033,567],{"class":236},[112,21035,21036,21038,21041],{"class":114,"line":208},[112,21037,621],{"class":229},[112,21039,21040],{"class":236}," refunds; ",[112,21042,21043],{"class":578},"// PaymentRefund[]\n",[112,21045,21046],{"class":114,"line":291},[112,21047,584],{"class":236},[16,21049],{},[67,21051,21053],{"id":21052},"step-7-listing-payouts","Step 7: Listing Payouts",[102,21055,21057],{"className":220,"code":21056,"language":222,"meta":107,"style":107},"export async function listPayouts(connectionId: string) {\n  const payouts = await sdk.payout.listPaymentPayouts({\n    connectionId,\n    limit: 10,\n  });\n  return payouts; // PaymentPayout[]\n}\n",[109,21058,21059,21080,21099,21103,21111,21115,21125],{"__ignoreMap":107},[112,21060,21061,21063,21065,21067,21070,21072,21074,21076,21078],{"class":114,"line":115},[112,21062,503],{"class":229},[112,21064,506],{"class":229},[112,21066,509],{"class":229},[112,21068,21069],{"class":118}," listPayouts",[112,21071,456],{"class":236},[112,21073,518],{"class":517},[112,21075,171],{"class":229},[112,21077,523],{"class":129},[112,21079,526],{"class":236},[112,21081,21082,21084,21087,21089,21091,21094,21097],{"class":114,"line":126},[112,21083,531],{"class":229},[112,21085,21086],{"class":129}," payouts",[112,21088,354],{"class":229},[112,21090,539],{"class":229},[112,21092,21093],{"class":236}," sdk.payout.",[112,21095,21096],{"class":118},"listPaymentPayouts",[112,21098,363],{"class":236},[112,21100,21101],{"class":114,"line":135},[112,21102,552],{"class":236},[112,21104,21105,21107,21109],{"class":114,"line":147},[112,21106,557],{"class":236},[112,21108,560],{"class":129},[112,21110,288],{"class":236},[112,21112,21113],{"class":114,"line":202},[112,21114,567],{"class":236},[112,21116,21117,21119,21122],{"class":114,"line":208},[112,21118,621],{"class":229},[112,21120,21121],{"class":236}," payouts; ",[112,21123,21124],{"class":578},"// PaymentPayout[]\n",[112,21126,21127],{"class":114,"line":291},[112,21128,584],{"class":236},[16,21130],{},[67,21132,21134],{"id":21133},"step-8-listing-subscriptions","Step 8: Listing Subscriptions",[102,21136,21138],{"className":220,"code":21137,"language":222,"meta":107,"style":107},"export async function listSubscriptions(connectionId: string) {\n  const subs = await sdk.subscription.listPaymentSubscriptions({\n    connectionId,\n    limit: 10,\n  });\n  return subs; // PaymentSubscription[]\n}\n",[109,21139,21140,21161,21180,21184,21192,21196,21206],{"__ignoreMap":107},[112,21141,21142,21144,21146,21148,21151,21153,21155,21157,21159],{"class":114,"line":115},[112,21143,503],{"class":229},[112,21145,506],{"class":229},[112,21147,509],{"class":229},[112,21149,21150],{"class":118}," listSubscriptions",[112,21152,456],{"class":236},[112,21154,518],{"class":517},[112,21156,171],{"class":229},[112,21158,523],{"class":129},[112,21160,526],{"class":236},[112,21162,21163,21165,21168,21170,21172,21175,21178],{"class":114,"line":126},[112,21164,531],{"class":229},[112,21166,21167],{"class":129}," subs",[112,21169,354],{"class":229},[112,21171,539],{"class":229},[112,21173,21174],{"class":236}," sdk.subscription.",[112,21176,21177],{"class":118},"listPaymentSubscriptions",[112,21179,363],{"class":236},[112,21181,21182],{"class":114,"line":135},[112,21183,552],{"class":236},[112,21185,21186,21188,21190],{"class":114,"line":147},[112,21187,557],{"class":236},[112,21189,560],{"class":129},[112,21191,288],{"class":236},[112,21193,21194],{"class":114,"line":202},[112,21195,567],{"class":236},[112,21197,21198,21200,21203],{"class":114,"line":208},[112,21199,621],{"class":229},[112,21201,21202],{"class":236}," subs; ",[112,21204,21205],{"class":578},"// PaymentSubscription[]\n",[112,21207,21208],{"class":114,"line":291},[112,21209,584],{"class":236},[16,21211],{},[67,21213,21215],{"id":21214},"step-9-example-usage","Step 9: Example Usage",[19,21217,21218],{},"Here's how you might use these functions in your payment workflow:",[102,21220,21222],{"className":220,"code":21221,"language":222,"meta":107,"style":107},"async function main() {\n  // 1. Create a payment\n  const payment = await createPayment(CONNECTION_STRIPE!, 1000, \"USD\");\n\n  // 2. List payments\n  const payments = await listPayments(CONNECTION_STRIPE!);\n\n  // 3. Create a payment link\n  const link = await createPaymentLink(CONNECTION_STRIPE!, 1000, \"USD\");\n\n  // 4. List links\n  const links = await sdk.link.listPaymentLinks({ connectionId: CONNECTION_STRIPE!, limit: 10 });\n\n  // 5. List refunds\n  const refunds = await listRefunds(CONNECTION_STRIPE!);\n\n  // 6. List payouts\n  const payouts = await listPayouts(CONNECTION_STRIPE!);\n\n  // 7. List subscriptions (creation may not be implemented for some providers)\n  const subscriptions = await listSubscriptions(CONNECTION_STRIPE!);\n\n  console.log(\"Payment:\", payment);\n  console.log(\"Payments count:\", payments.length);\n  console.log(\"Payment Link URL:\", link.url);\n  console.log(\"Links count:\", links.length);\n  console.log(\"Refunds count:\", refunds.length);\n  console.log(\"Payouts count:\", payouts.length);\n  console.log(\"Subscriptions count:\", subscriptions.length);\n}\n\nmain();\n",[109,21223,21224,21234,21239,21271,21275,21280,21300,21304,21309,21337,21341,21346,21377,21381,21386,21406,21410,21415,21435,21439,21444,21465,21469,21483,21501,21515,21533,21551,21569,21587,21591,21595],{"__ignoreMap":107},[112,21225,21226,21228,21230,21232],{"class":114,"line":115},[112,21227,1377],{"class":229},[112,21229,509],{"class":229},[112,21231,1382],{"class":118},[112,21233,1385],{"class":236},[112,21235,21236],{"class":114,"line":126},[112,21237,21238],{"class":578},"  // 1. Create a payment\n",[112,21240,21241,21243,21246,21248,21250,21253,21255,21257,21259,21261,21264,21266,21269],{"class":114,"line":135},[112,21242,531],{"class":229},[112,21244,21245],{"class":129}," payment",[112,21247,354],{"class":229},[112,21249,539],{"class":229},[112,21251,21252],{"class":118}," createPayment",[112,21254,456],{"class":236},[112,21256,20654],{"class":129},[112,21258,375],{"class":229},[112,21260,1046],{"class":236},[112,21262,21263],{"class":129},"1000",[112,21265,1046],{"class":236},[112,21267,21268],{"class":122},"\"USD\"",[112,21270,464],{"class":236},[112,21272,21273],{"class":114,"line":147},[112,21274,272],{"emptyLinePlaceholder":271},[112,21276,21277],{"class":114,"line":202},[112,21278,21279],{"class":578},"  // 2. List payments\n",[112,21281,21282,21284,21286,21288,21290,21292,21294,21296,21298],{"class":114,"line":208},[112,21283,531],{"class":229},[112,21285,20739],{"class":129},[112,21287,354],{"class":229},[112,21289,539],{"class":229},[112,21291,20722],{"class":118},[112,21293,456],{"class":236},[112,21295,20654],{"class":129},[112,21297,375],{"class":229},[112,21299,464],{"class":236},[112,21301,21302],{"class":114,"line":291},[112,21303,272],{"emptyLinePlaceholder":271},[112,21305,21306],{"class":114,"line":299},[112,21307,21308],{"class":578},"  // 3. Create a payment link\n",[112,21310,21311,21313,21315,21317,21319,21321,21323,21325,21327,21329,21331,21333,21335],{"class":114,"line":307},[112,21312,531],{"class":229},[112,21314,20838],{"class":129},[112,21316,354],{"class":229},[112,21318,539],{"class":229},[112,21320,20803],{"class":118},[112,21322,456],{"class":236},[112,21324,20654],{"class":129},[112,21326,375],{"class":229},[112,21328,1046],{"class":236},[112,21330,21263],{"class":129},[112,21332,1046],{"class":236},[112,21334,21268],{"class":122},[112,21336,464],{"class":236},[112,21338,21339],{"class":114,"line":315},[112,21340,272],{"emptyLinePlaceholder":271},[112,21342,21343],{"class":114,"line":323},[112,21344,21345],{"class":578},"  // 4. List links\n",[112,21347,21348,21350,21353,21355,21357,21359,21362,21365,21367,21369,21372,21374],{"class":114,"line":329},[112,21349,531],{"class":229},[112,21351,21352],{"class":129}," links",[112,21354,354],{"class":229},[112,21356,539],{"class":229},[112,21358,20845],{"class":236},[112,21360,21361],{"class":118},"listPaymentLinks",[112,21363,21364],{"class":236},"({ connectionId: ",[112,21366,20654],{"class":129},[112,21368,375],{"class":229},[112,21370,21371],{"class":236},", limit: ",[112,21373,560],{"class":129},[112,21375,21376],{"class":236}," });\n",[112,21378,21379],{"class":114,"line":341},[112,21380,272],{"emptyLinePlaceholder":271},[112,21382,21383],{"class":114,"line":346},[112,21384,21385],{"class":578},"  // 5. List refunds\n",[112,21387,21388,21390,21392,21394,21396,21398,21400,21402,21404],{"class":114,"line":366},[112,21389,531],{"class":229},[112,21391,21005],{"class":129},[112,21393,354],{"class":229},[112,21395,539],{"class":229},[112,21397,20988],{"class":118},[112,21399,456],{"class":236},[112,21401,20654],{"class":129},[112,21403,375],{"class":229},[112,21405,464],{"class":236},[112,21407,21408],{"class":114,"line":381},[112,21409,272],{"emptyLinePlaceholder":271},[112,21411,21412],{"class":114,"line":387},[112,21413,21414],{"class":578},"  // 6. List payouts\n",[112,21416,21417,21419,21421,21423,21425,21427,21429,21431,21433],{"class":114,"line":392},[112,21418,531],{"class":229},[112,21420,21086],{"class":129},[112,21422,354],{"class":229},[112,21424,539],{"class":229},[112,21426,21069],{"class":118},[112,21428,456],{"class":236},[112,21430,20654],{"class":129},[112,21432,375],{"class":229},[112,21434,464],{"class":236},[112,21436,21437],{"class":114,"line":409},[112,21438,272],{"emptyLinePlaceholder":271},[112,21440,21441],{"class":114,"line":422},[112,21442,21443],{"class":578},"  // 7. List subscriptions (creation may not be implemented for some providers)\n",[112,21445,21446,21448,21451,21453,21455,21457,21459,21461,21463],{"class":114,"line":435},[112,21447,531],{"class":229},[112,21449,21450],{"class":129}," subscriptions",[112,21452,354],{"class":229},[112,21454,539],{"class":229},[112,21456,21150],{"class":118},[112,21458,456],{"class":236},[112,21460,20654],{"class":129},[112,21462,375],{"class":229},[112,21464,464],{"class":236},[112,21466,21467],{"class":114,"line":440},[112,21468,272],{"emptyLinePlaceholder":271},[112,21470,21471,21473,21475,21477,21480],{"class":114,"line":4949},[112,21472,1509],{"class":236},[112,21474,1512],{"class":118},[112,21476,456],{"class":236},[112,21478,21479],{"class":122},"\"Payment:\"",[112,21481,21482],{"class":236},", payment);\n",[112,21484,21485,21487,21489,21491,21494,21497,21499],{"class":114,"line":4960},[112,21486,1509],{"class":236},[112,21488,1512],{"class":118},[112,21490,456],{"class":236},[112,21492,21493],{"class":122},"\"Payments count:\"",[112,21495,21496],{"class":236},", payments.",[112,21498,14591],{"class":129},[112,21500,464],{"class":236},[112,21502,21503,21505,21507,21509,21512],{"class":114,"line":4972},[112,21504,1509],{"class":236},[112,21506,1512],{"class":118},[112,21508,456],{"class":236},[112,21510,21511],{"class":122},"\"Payment Link URL:\"",[112,21513,21514],{"class":236},", link.url);\n",[112,21516,21517,21519,21521,21523,21526,21529,21531],{"class":114,"line":4984},[112,21518,1509],{"class":236},[112,21520,1512],{"class":118},[112,21522,456],{"class":236},[112,21524,21525],{"class":122},"\"Links count:\"",[112,21527,21528],{"class":236},", links.",[112,21530,14591],{"class":129},[112,21532,464],{"class":236},[112,21534,21535,21537,21539,21541,21544,21547,21549],{"class":114,"line":4992},[112,21536,1509],{"class":236},[112,21538,1512],{"class":118},[112,21540,456],{"class":236},[112,21542,21543],{"class":122},"\"Refunds count:\"",[112,21545,21546],{"class":236},", refunds.",[112,21548,14591],{"class":129},[112,21550,464],{"class":236},[112,21552,21553,21555,21557,21559,21562,21565,21567],{"class":114,"line":5000},[112,21554,1509],{"class":236},[112,21556,1512],{"class":118},[112,21558,456],{"class":236},[112,21560,21561],{"class":122},"\"Payouts count:\"",[112,21563,21564],{"class":236},", payouts.",[112,21566,14591],{"class":129},[112,21568,464],{"class":236},[112,21570,21571,21573,21575,21577,21580,21583,21585],{"class":114,"line":5008},[112,21572,1509],{"class":236},[112,21574,1512],{"class":118},[112,21576,456],{"class":236},[112,21578,21579],{"class":122},"\"Subscriptions count:\"",[112,21581,21582],{"class":236},", subscriptions.",[112,21584,14591],{"class":129},[112,21586,464],{"class":236},[112,21588,21589],{"class":114,"line":5016},[112,21590,584],{"class":236},[112,21592,21593],{"class":114,"line":5024},[112,21594,272],{"emptyLinePlaceholder":271},[112,21596,21597,21599],{"class":114,"line":5032},[112,21598,1533],{"class":118},[112,21600,1536],{"class":236},[16,21602],{},[19,21604,21605],{},"Happy building! 🎉",[1558,21607,1560],{},{"title":107,"searchDepth":126,"depth":126,"links":21609},[21610,21611,21612,21613,21614,21615,21616,21617,21618,21619],{"id":69,"depth":126,"text":70},{"id":96,"depth":126,"text":97},{"id":20611,"depth":126,"text":20612},{"id":469,"depth":126,"text":470},{"id":20705,"depth":126,"text":20706},{"id":20786,"depth":126,"text":20787},{"id":20971,"depth":126,"text":20972},{"id":21052,"depth":126,"text":21053},{"id":21133,"depth":126,"text":21134},{"id":21214,"depth":126,"text":21215},"With Unified, you can build fin-tech products that work with your end customers payment providers. With a single integration you can connect payment processors...",{"img":21622,"date":21623,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_fintech_application_with_unified_payments_api-icon.png","2025-09-09T00:00:00.000Z","/guides/how_to_build_a_fintech_application_with_unified_payments_api",{"title":20496,"description":21620},"guides/how_to_build_a_fintech_application_with_unified_payments_api","P7xpdVKUa63XEsydfDMj6ISvjMEn2M31mUnFbZERXwk",{"id":21629,"title":21630,"body":21631,"description":21645,"extension":1576,"meta":22558,"navigation":271,"path":22561,"seo":22562,"stem":22563,"__hash__":22564},"guides/guides/how_to_build_an_e_commerce_product_integration_with_unified.md","How to Build an E-Commerce Product Integration with Unified",{"type":9,"value":21632,"toc":22548},[21633,21636,21638,21643,21646,21649,21652,21656,21672,21674,21710,21714,21747,21749,21751,21854,21856,21858,21861,21866,21869,21877,21879,21883,21886,22041,22046,22054,22056,22060,22063,22246,22250,22258,22260,22264,22267,22350,22354,22362,22364,22368,22371,22543,22545],[12,21634,21630],{"id":21635},"how-to-build-an-e-commerce-product-integration-with-unified",[16,21637],{},[19,21639,21640],{},[22,21641,21642],{},"September 8, 2025",[19,21644,21645],{},"Unified makes it possible for developers to build ecom products that work with your end customers preferred ecom platforms!",[19,21647,21648],{},"With our Unified Commerce API, you can connect to dozens of ecom systems (like Shopify, BigCommerce, WooCommerce and more).",[19,21650,21651],{},"This article will give you knowledge on how to create and list products, and to even create product images from the product description using Unified's GenAI integration.",[67,21653,21655],{"id":21654},"requirements","Requirements",[72,21657,21658,21661,21664,21666,21669],{},[46,21659,21660],{},"Node.js (v1",[46,21662,21663],{},"Unified account with ecom integration",[46,21665,82],{},[46,21667,21668],{},"Your end customer's e-commerce connection ID",[46,21670,21671],{},"Unified GenAI connection ID",[67,21673,97],{"id":96},[102,21675,21677],{"className":104,"code":21676,"language":106,"meta":107,"style":107},"mkdir ecommerce-demo\ncd ecommerce-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[109,21678,21679,21686,21692,21700],{"__ignoreMap":107},[112,21680,21681,21683],{"class":114,"line":115},[112,21682,119],{"class":118},[112,21684,21685],{"class":122}," ecommerce-demo\n",[112,21687,21688,21690],{"class":114,"line":126},[112,21689,130],{"class":129},[112,21691,21685],{"class":122},[112,21693,21694,21696,21698],{"class":114,"line":135},[112,21695,138],{"class":118},[112,21697,141],{"class":122},[112,21699,144],{"class":129},[112,21701,21702,21704,21706,21708],{"class":114,"line":147},[112,21703,138],{"class":118},[112,21705,152],{"class":122},[112,21707,155],{"class":122},[112,21709,20588],{"class":122},[19,21711,167,21712,171],{},[109,21713,170],{},[102,21715,21717],{"className":17953,"code":21716,"language":17955,"meta":107,"style":107},"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_SHOPIFY=your_customer_shopify_connection_id\nCONNECTION_GENAI=your_genai_connection_id\n",[109,21718,21719,21728,21738],{"__ignoreMap":107},[112,21720,21721,21723,21725],{"class":114,"line":115},[112,21722,372],{"class":236},[112,21724,335],{"class":229},[112,21726,21727],{"class":122},"your_unified_api_key\n",[112,21729,21730,21733,21735],{"class":114,"line":126},[112,21731,21732],{"class":236},"CONNECTION_SHOPIFY",[112,21734,335],{"class":229},[112,21736,21737],{"class":122},"your_customer_shopify_connection_id\n",[112,21739,21740,21742,21744],{"class":114,"line":135},[112,21741,931],{"class":236},[112,21743,335],{"class":229},[112,21745,21746],{"class":122},"your_genai_connection_id\n",[16,21748],{},[67,21750,20612],{"id":20611},[102,21752,21754],{"className":220,"code":21753,"language":222,"meta":107,"style":107},"import 'dotenv/config';\n\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { \n    UNIFIED_API_KEY, \n    CONNECTION_SHOPIFY, \n    CONNECTION_GENAI \n} = process.env;\n\nconst sdk = new UnifiedTo({\n    security: { jwt: UNIFIED_API_KEY! },\n});\n",[109,21755,21756,21764,21768,21780,21784,21791,21798,21805,21813,21821,21825,21839,21850],{"__ignoreMap":107},[112,21757,21758,21760,21762],{"class":114,"line":115},[112,21759,230],{"class":229},[112,21761,233],{"class":122},[112,21763,237],{"class":236},[112,21765,21766],{"class":114,"line":126},[112,21767,272],{"emptyLinePlaceholder":271},[112,21769,21770,21772,21774,21776,21778],{"class":114,"line":135},[112,21771,230],{"class":229},[112,21773,244],{"class":236},[112,21775,247],{"class":229},[112,21777,250],{"class":122},[112,21779,237],{"class":236},[112,21781,21782],{"class":114,"line":147},[112,21783,272],{"emptyLinePlaceholder":271},[112,21785,21786,21788],{"class":114,"line":202},[112,21787,277],{"class":229},[112,21789,21790],{"class":236}," { \n",[112,21792,21793,21795],{"class":114,"line":208},[112,21794,19969],{"class":129},[112,21796,21797],{"class":236},", \n",[112,21799,21800,21803],{"class":114,"line":291},[112,21801,21802],{"class":129},"    CONNECTION_SHOPIFY",[112,21804,21797],{"class":236},[112,21806,21807,21810],{"class":114,"line":299},[112,21808,21809],{"class":129},"    CONNECTION_GENAI",[112,21811,21812],{"class":236}," \n",[112,21814,21815,21817,21819],{"class":114,"line":307},[112,21816,332],{"class":236},[112,21818,335],{"class":229},[112,21820,338],{"class":236},[112,21822,21823],{"class":114,"line":315},[112,21824,272],{"emptyLinePlaceholder":271},[112,21826,21827,21829,21831,21833,21835,21837],{"class":114,"line":323},[112,21828,277],{"class":229},[112,21830,351],{"class":129},[112,21832,354],{"class":229},[112,21834,357],{"class":229},[112,21836,360],{"class":118},[112,21838,363],{"class":236},[112,21840,21841,21844,21846,21848],{"class":114,"line":329},[112,21842,21843],{"class":236},"    security: { jwt: ",[112,21845,372],{"class":129},[112,21847,375],{"class":229},[112,21849,378],{"class":236},[112,21851,21852],{"class":114,"line":341},[112,21853,384],{"class":236},[16,21855],{},[67,21857,470],{"id":469},[19,21859,21860],{},"Before you can create or list products, your customer must authorize your app to access their e-commerce store via Unified's  authentication flow.",[19,21862,476,21863,21865],{},[478,21864,480],{}," for that customer's integration (e.g., Shopify).",[19,21867,21868],{},"Store this connection ID securely as shown above and use it in all API calls for that customer.",[19,21870,21871,21872,634],{},"See the ",[1614,21873,21876],{"href":21874,"rel":21875},"https://unified.to/commerce",[1618],"full list of supported integrations",[16,21878],{},[67,21880,21882],{"id":21881},"step-4-generate-a-product-image-from-description-with-genai","Step 4: Generate a Product Image from Description (with GenAI)",[19,21884,21885],{},"You can use Unified GenAI to generate a product image based on the product description.",[102,21887,21889],{"className":220,"code":21888,"language":222,"meta":107,"style":107},"export async function generateProductImage(description: string) {\n    const prompt = `Generate a high-quality product image for the following product description: ${description}`;\n\n    const result = await sdk.genai.createGenaiPrompt({\n        connectionId: CONNECTION_GENAI!,\n        prompt: {\n            messages: [{ role: \"USER\", content: prompt }],\n            maxTokens: 1024,\n            temperature: 0.7,\n            responseFormat: \"image_url\", // or whatever the GenAI API expects for image output\n        },\n    });\n\n    return result.choices?.[0]?.message?.content || \"\";\n}\n",[109,21890,21891,21912,21930,21934,21950,21961,21966,21976,21985,21995,22008,22012,22016,22020,22037],{"__ignoreMap":107},[112,21892,21893,21895,21897,21899,21902,21904,21906,21908,21910],{"class":114,"line":115},[112,21894,503],{"class":229},[112,21896,506],{"class":229},[112,21898,509],{"class":229},[112,21900,21901],{"class":118}," generateProductImage",[112,21903,456],{"class":236},[112,21905,16567],{"class":517},[112,21907,171],{"class":229},[112,21909,523],{"class":129},[112,21911,526],{"class":236},[112,21913,21914,21916,21919,21921,21924,21926,21928],{"class":114,"line":126},[112,21915,1435],{"class":229},[112,21917,21918],{"class":129}," prompt",[112,21920,354],{"class":229},[112,21922,21923],{"class":122}," `Generate a high-quality product image for the following product description: ${",[112,21925,16567],{"class":236},[112,21927,640],{"class":122},[112,21929,237],{"class":236},[112,21931,21932],{"class":114,"line":135},[112,21933,272],{"emptyLinePlaceholder":271},[112,21935,21936,21938,21940,21942,21944,21946,21948],{"class":114,"line":147},[112,21937,1435],{"class":229},[112,21939,911],{"class":129},[112,21941,354],{"class":229},[112,21943,539],{"class":229},[112,21945,918],{"class":236},[112,21947,1191],{"class":118},[112,21949,363],{"class":236},[112,21951,21952,21955,21957,21959],{"class":114,"line":202},[112,21953,21954],{"class":236},"        connectionId: ",[112,21956,931],{"class":129},[112,21958,375],{"class":229},[112,21960,288],{"class":236},[112,21962,21963],{"class":114,"line":208},[112,21964,21965],{"class":236},"        prompt: {\n",[112,21967,21968,21971,21973],{"class":114,"line":291},[112,21969,21970],{"class":236},"            messages: [{ role: ",[112,21972,1216],{"class":122},[112,21974,21975],{"class":236},", content: prompt }],\n",[112,21977,21978,21981,21983],{"class":114,"line":299},[112,21979,21980],{"class":236},"            maxTokens: ",[112,21982,973],{"class":129},[112,21984,288],{"class":236},[112,21986,21987,21990,21993],{"class":114,"line":307},[112,21988,21989],{"class":236},"            temperature: ",[112,21991,21992],{"class":129},"0.7",[112,21994,288],{"class":236},[112,21996,21997,22000,22003,22005],{"class":114,"line":315},[112,21998,21999],{"class":236},"            responseFormat: ",[112,22001,22002],{"class":122},"\"image_url\"",[112,22004,1046],{"class":236},[112,22006,22007],{"class":578},"// or whatever the GenAI API expects for image output\n",[112,22009,22010],{"class":114,"line":323},[112,22011,4803],{"class":236},[112,22013,22014],{"class":114,"line":329},[112,22015,15149],{"class":236},[112,22017,22018],{"class":114,"line":341},[112,22019,272],{"emptyLinePlaceholder":271},[112,22021,22022,22024,22026,22028,22031,22033,22035],{"class":114,"line":346},[112,22023,572],{"class":229},[112,22025,1282],{"class":236},[112,22027,660],{"class":129},[112,22029,22030],{"class":236},"]?.message?.content ",[112,22032,1109],{"class":229},[112,22034,1112],{"class":122},[112,22036,237],{"class":236},[112,22038,22039],{"class":114,"line":366},[112,22040,584],{"class":236},[19,22042,22043],{},[22,22044,22045],{},"Explanation:",[72,22047,22048,22051],{},[46,22049,22050],{},"This function sends the product description to Unified GenAI and gets back an image URL.",[46,22052,22053],{},"You can use this image URL when creating the product in Shopify (or any other e-commerce platform).",[16,22055],{},[67,22057,22059],{"id":22058},"step-5-create-a-product-with-ai-generated-image","Step 5: Create a Product (with AI-generated Image)",[19,22061,22062],{},"Here's how to create a product in Shopify, using the generated image.",[102,22064,22066],{"className":220,"code":22065,"language":222,"meta":107,"style":107},"export async function createProduct(connectionId: string, name: string, description: string, price: number) {\n\n    // 1. Generate product image\n    const imageUrl = await generateProductImage(description);\n\n    // 2. Create the product\n    const createProductResult = await sdk.commerce.createCommerceItem({\n        connectionId,\n        commerceItem: {\n            name,\n            description,\n            price,\n            media: imageUrl ? [{ url: imageUrl }] : [],\n            isActive: true,\n            // Add any other fields as needed (e.g., tags, variants, metadata)\n        },\n    });\n\n    return createProductResult; // commerceItem\n}\n",[109,22067,22068,22114,22118,22123,22139,22143,22148,22167,22171,22176,22181,22186,22191,22206,22215,22220,22224,22228,22232,22242],{"__ignoreMap":107},[112,22069,22070,22072,22074,22076,22079,22081,22083,22085,22087,22089,22091,22093,22095,22097,22099,22101,22103,22105,22108,22110,22112],{"class":114,"line":115},[112,22071,503],{"class":229},[112,22073,506],{"class":229},[112,22075,509],{"class":229},[112,22077,22078],{"class":118}," createProduct",[112,22080,456],{"class":236},[112,22082,518],{"class":517},[112,22084,171],{"class":229},[112,22086,523],{"class":129},[112,22088,1046],{"class":236},[112,22090,637],{"class":517},[112,22092,171],{"class":229},[112,22094,523],{"class":129},[112,22096,1046],{"class":236},[112,22098,16567],{"class":517},[112,22100,171],{"class":229},[112,22102,523],{"class":129},[112,22104,1046],{"class":236},[112,22106,22107],{"class":517},"price",[112,22109,171],{"class":229},[112,22111,1054],{"class":129},[112,22113,526],{"class":236},[112,22115,22116],{"class":114,"line":126},[112,22117,272],{"emptyLinePlaceholder":271},[112,22119,22120],{"class":114,"line":135},[112,22121,22122],{"class":578},"    // 1. Generate product image\n",[112,22124,22125,22127,22130,22132,22134,22136],{"class":114,"line":147},[112,22126,1435],{"class":229},[112,22128,22129],{"class":129}," imageUrl",[112,22131,354],{"class":229},[112,22133,539],{"class":229},[112,22135,21901],{"class":118},[112,22137,22138],{"class":236},"(description);\n",[112,22140,22141],{"class":114,"line":202},[112,22142,272],{"emptyLinePlaceholder":271},[112,22144,22145],{"class":114,"line":208},[112,22146,22147],{"class":578},"    // 2. Create the product\n",[112,22149,22150,22152,22155,22157,22159,22162,22165],{"class":114,"line":291},[112,22151,1435],{"class":229},[112,22153,22154],{"class":129}," createProductResult",[112,22156,354],{"class":229},[112,22158,539],{"class":229},[112,22160,22161],{"class":236}," sdk.commerce.",[112,22163,22164],{"class":118},"createCommerceItem",[112,22166,363],{"class":236},[112,22168,22169],{"class":114,"line":299},[112,22170,15585],{"class":236},[112,22172,22173],{"class":114,"line":307},[112,22174,22175],{"class":236},"        commerceItem: {\n",[112,22177,22178],{"class":114,"line":315},[112,22179,22180],{"class":236},"            name,\n",[112,22182,22183],{"class":114,"line":323},[112,22184,22185],{"class":236},"            description,\n",[112,22187,22188],{"class":114,"line":329},[112,22189,22190],{"class":236},"            price,\n",[112,22192,22193,22196,22198,22201,22203],{"class":114,"line":341},[112,22194,22195],{"class":236},"            media: imageUrl ",[112,22197,4711],{"class":229},[112,22199,22200],{"class":236}," [{ url: imageUrl }] ",[112,22202,171],{"class":229},[112,22204,22205],{"class":236}," [],\n",[112,22207,22208,22211,22213],{"class":114,"line":346},[112,22209,22210],{"class":236},"            isActive: ",[112,22212,1340],{"class":129},[112,22214,288],{"class":236},[112,22216,22217],{"class":114,"line":366},[112,22218,22219],{"class":578},"            // Add any other fields as needed (e.g., tags, variants, metadata)\n",[112,22221,22222],{"class":114,"line":381},[112,22223,4803],{"class":236},[112,22225,22226],{"class":114,"line":387},[112,22227,15149],{"class":236},[112,22229,22230],{"class":114,"line":392},[112,22231,272],{"emptyLinePlaceholder":271},[112,22233,22234,22236,22239],{"class":114,"line":409},[112,22235,572],{"class":229},[112,22237,22238],{"class":236}," createProductResult; ",[112,22240,22241],{"class":578},"// commerceItem\n",[112,22243,22244],{"class":114,"line":422},[112,22245,584],{"class":236},[19,22247,22248],{},[22,22249,22045],{},[72,22251,22252,22255],{},[46,22253,22254],{},"Generates an image from the description.",[46,22256,22257],{},"Creates a product in Shopify (or any Unified-supported e-commerce platform) with the image and other details.",[16,22259],{},[67,22261,22263],{"id":22262},"step-6-list-products","Step 6: List Products",[19,22265,22266],{},"You can list all products for a customer's e-commerce connection:",[102,22268,22270],{"className":220,"code":22269,"language":222,"meta":107,"style":107},"export async function listProducts(connectionId: string) {\n\n    const productsResult = await sdk.commerce.listCommerceItems({\n        connectionId,\n        limit: 10,\n    });\n\n    return productsResult; // commerceItem[]\n}\n",[109,22271,22272,22293,22297,22315,22319,22328,22332,22336,22346],{"__ignoreMap":107},[112,22273,22274,22276,22278,22280,22283,22285,22287,22289,22291],{"class":114,"line":115},[112,22275,503],{"class":229},[112,22277,506],{"class":229},[112,22279,509],{"class":229},[112,22281,22282],{"class":118}," listProducts",[112,22284,456],{"class":236},[112,22286,518],{"class":517},[112,22288,171],{"class":229},[112,22290,523],{"class":129},[112,22292,526],{"class":236},[112,22294,22295],{"class":114,"line":126},[112,22296,272],{"emptyLinePlaceholder":271},[112,22298,22299,22301,22304,22306,22308,22310,22313],{"class":114,"line":135},[112,22300,1435],{"class":229},[112,22302,22303],{"class":129}," productsResult",[112,22305,354],{"class":229},[112,22307,539],{"class":229},[112,22309,22161],{"class":236},[112,22311,22312],{"class":118},"listCommerceItems",[112,22314,363],{"class":236},[112,22316,22317],{"class":114,"line":147},[112,22318,15585],{"class":236},[112,22320,22321,22324,22326],{"class":114,"line":202},[112,22322,22323],{"class":236},"        limit: ",[112,22325,560],{"class":129},[112,22327,288],{"class":236},[112,22329,22330],{"class":114,"line":208},[112,22331,15149],{"class":236},[112,22333,22334],{"class":114,"line":291},[112,22335,272],{"emptyLinePlaceholder":271},[112,22337,22338,22340,22343],{"class":114,"line":299},[112,22339,572],{"class":229},[112,22341,22342],{"class":236}," productsResult; ",[112,22344,22345],{"class":578},"// commerceItem[]\n",[112,22347,22348],{"class":114,"line":307},[112,22349,584],{"class":236},[19,22351,22352],{},[22,22353,22045],{},[72,22355,22356,22359],{},[46,22357,22358],{},"Fetches the first 10 products for the customer's store.",[46,22360,22361],{},"You can filter, paginate, or sort as needed.",[16,22363],{},[67,22365,22367],{"id":22366},"step-7-example-usage","Step 7: Example Usage",[19,22369,22370],{},"Here's how you might use these functions in your product workflow:",[102,22372,22374],{"className":220,"code":22373,"language":222,"meta":107,"style":107},"async function main() {\n    const name = \"AI-Generated T-Shirt\";\n\n    const description = \"A stylish t-shirt with a unique, AI-generated design.\";\n\n    const price = 29.99;\n\n    // 1. Create the product with an AI-generated image\n    const product = await createProduct(CONNECTION_SHOPIFY!, name, description, price);\n\n    // 2. List products\n    const products = await listProducts(CONNECTION_SHOPIFY!);\n\n    console.log(\"Created product:\", product);\n    console.log(\"All products:\", products);\n}\n\nmain();\n",[109,22375,22376,22386,22400,22404,22418,22422,22436,22440,22445,22467,22471,22476,22497,22501,22515,22529,22533,22537],{"__ignoreMap":107},[112,22377,22378,22380,22382,22384],{"class":114,"line":115},[112,22379,1377],{"class":229},[112,22381,509],{"class":229},[112,22383,1382],{"class":118},[112,22385,1385],{"class":236},[112,22387,22388,22390,22393,22395,22398],{"class":114,"line":126},[112,22389,1435],{"class":229},[112,22391,22392],{"class":129}," name",[112,22394,354],{"class":229},[112,22396,22397],{"class":122}," \"AI-Generated T-Shirt\"",[112,22399,237],{"class":236},[112,22401,22402],{"class":114,"line":135},[112,22403,272],{"emptyLinePlaceholder":271},[112,22405,22406,22408,22411,22413,22416],{"class":114,"line":147},[112,22407,1435],{"class":229},[112,22409,22410],{"class":129}," description",[112,22412,354],{"class":229},[112,22414,22415],{"class":122}," \"A stylish t-shirt with a unique, AI-generated design.\"",[112,22417,237],{"class":236},[112,22419,22420],{"class":114,"line":202},[112,22421,272],{"emptyLinePlaceholder":271},[112,22423,22424,22426,22429,22431,22434],{"class":114,"line":208},[112,22425,1435],{"class":229},[112,22427,22428],{"class":129}," price",[112,22430,354],{"class":229},[112,22432,22433],{"class":129}," 29.99",[112,22435,237],{"class":236},[112,22437,22438],{"class":114,"line":291},[112,22439,272],{"emptyLinePlaceholder":271},[112,22441,22442],{"class":114,"line":299},[112,22443,22444],{"class":578},"    // 1. Create the product with an AI-generated image\n",[112,22446,22447,22449,22452,22454,22456,22458,22460,22462,22464],{"class":114,"line":307},[112,22448,1435],{"class":229},[112,22450,22451],{"class":129}," product",[112,22453,354],{"class":229},[112,22455,539],{"class":229},[112,22457,22078],{"class":118},[112,22459,456],{"class":236},[112,22461,21732],{"class":129},[112,22463,375],{"class":229},[112,22465,22466],{"class":236},", name, description, price);\n",[112,22468,22469],{"class":114,"line":315},[112,22470,272],{"emptyLinePlaceholder":271},[112,22472,22473],{"class":114,"line":323},[112,22474,22475],{"class":578},"    // 2. List products\n",[112,22477,22478,22480,22483,22485,22487,22489,22491,22493,22495],{"class":114,"line":329},[112,22479,1435],{"class":229},[112,22481,22482],{"class":129}," products",[112,22484,354],{"class":229},[112,22486,539],{"class":229},[112,22488,22282],{"class":118},[112,22490,456],{"class":236},[112,22492,21732],{"class":129},[112,22494,375],{"class":229},[112,22496,464],{"class":236},[112,22498,22499],{"class":114,"line":341},[112,22500,272],{"emptyLinePlaceholder":271},[112,22502,22503,22505,22507,22509,22512],{"class":114,"line":346},[112,22504,17339],{"class":236},[112,22506,1512],{"class":118},[112,22508,456],{"class":236},[112,22510,22511],{"class":122},"\"Created product:\"",[112,22513,22514],{"class":236},", product);\n",[112,22516,22517,22519,22521,22523,22526],{"class":114,"line":366},[112,22518,17339],{"class":236},[112,22520,1512],{"class":118},[112,22522,456],{"class":236},[112,22524,22525],{"class":122},"\"All products:\"",[112,22527,22528],{"class":236},", products);\n",[112,22530,22531],{"class":114,"line":381},[112,22532,584],{"class":236},[112,22534,22535],{"class":114,"line":387},[112,22536,272],{"emptyLinePlaceholder":271},[112,22538,22539,22541],{"class":114,"line":392},[112,22540,1533],{"class":118},[112,22542,1536],{"class":236},[16,22544],{},[1558,22546,22547],{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":107,"searchDepth":126,"depth":126,"links":22549},[22550,22551,22552,22553,22554,22555,22556,22557],{"id":21654,"depth":126,"text":21655},{"id":96,"depth":126,"text":97},{"id":20611,"depth":126,"text":20612},{"id":469,"depth":126,"text":470},{"id":21881,"depth":126,"text":21882},{"id":22058,"depth":126,"text":22059},{"id":22262,"depth":126,"text":22263},{"id":22366,"depth":126,"text":22367},{"img":22559,"date":22560,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_e_commerce_product_integration_with_unified-icon.png","2025-09-08T00:00:00.000Z","/guides/how_to_build_an_e_commerce_product_integration_with_unified",{"title":21630,"description":21645},"guides/how_to_build_an_e_commerce_product_integration_with_unified","_3NnejLsYsbwXKdC6RPhbh-I8LndYKw61lRgD43_tD8",{"id":22566,"title":22567,"body":22568,"description":23205,"extension":1576,"meta":23206,"navigation":271,"path":23209,"seo":23210,"stem":23211,"__hash__":23212},"guides/guides/how_to_build_an_invoicing_system_with_unified.md","How to build an invoicing system with Unified.to",{"type":9,"value":22569,"toc":23197},[22570,22573,22575,22580,22587,22589,22597,22602,22611,22613,22616,22624,22626,22630,22633,22639,22644,22654,22760,22765,22775,22792,22797,22802,22817,22921,22926,22929,22940,22950,22955,22958,22968,23112,23116,23127,23154,23156,23165,23168,23195],[12,22571,22567],{"id":22572},"how-to-build-an-invoicing-system-with-unifiedto",[16,22574],{},[19,22576,22577],{},[22,22578,22579],{},"January 3, 2024",[19,22581,22582,22583,22586],{},"When building a SaaS app for invoicing, you'll need to exchange data within your customers' accounting app of choice. In this guide, we'll cover the basics of how to access the data you need for your invoicing app with the help of ",[1614,22584,1640],{"href":1638,"rel":22585},[1618],"'s unified accounting API.",[67,22588,70],{"id":69},[19,22590,16379,22591,22594,22595,16387],{},[1614,22592,14265],{"href":14263,"rel":22593},[1618]," article. It will walk you through registering for a free account and onboarding. Once you have completed the onboarding steps, go ahead and ",[12408,22596],{"width":12410,"height":12411,"src":16386,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},[19,22598,22599],{},[1603,22600],{"alt":11593,"src":22601},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_invoicing_system_with_unified-0.png",[19,22603,22604,22605,22608,22609,16403],{},"The next step is to deploy the ",[1614,22606,1640],{"href":1638,"rel":22607},[1618]," Embedded Authorization widget in your product's user interface (UI). Check out our ",[12408,22610],{"width":12410,"height":12411,"src":16402,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},[67,22612,9690],{"id":9689},[19,22614,22615],{},"Here are the steps that you will need to support to build your invoicing app:",[43,22617,22618,22621],{},[46,22619,22620],{},"create an invoice",[46,22622,22623],{},"pay an invoice or cancel an invoice",[19,22625,16419],{},[67,22627,22629],{"id":22628},"step-1-create-an-invoice","Step 1: Create an invoice",[19,22631,22632],{},"To generate an invoice, gather specific details from your end user, including essential information like the amount, line items/products, due date, and customer details.",[19,22634,22635,22638],{},[1614,22636,1640],{"href":1638,"rel":22637},[1618]," can help with two of those values: customer and product.",[19,22640,22641],{},[478,22642,22643],{},"Customers",[19,22645,22646,22647,2251,22650,634],{},"To get a list of existing customers from your end user's accounting system, simply call the ",[109,22648,22649],{},"listCustomers",[1614,22651,16443],{"href":22652,"rel":22653},"https://docs.unified.to/accounting/customer/List_all_customers",[1618],[102,22655,22657],{"className":220,"code":22656,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function getCustomers(connectionId: string) {\n    return await sdk.accounting.listAccountingContacts({\n        connectionId,\n    });\n}\n",[109,22658,22659,22671,22675,22689,22693,22701,22705,22709,22713,22734,22748,22752,22756],{"__ignoreMap":107},[112,22660,22661,22663,22665,22667,22669],{"class":114,"line":115},[112,22662,230],{"class":229},[112,22664,244],{"class":236},[112,22666,247],{"class":229},[112,22668,250],{"class":122},[112,22670,237],{"class":236},[112,22672,22673],{"class":114,"line":126},[112,22674,272],{"emptyLinePlaceholder":271},[112,22676,22677,22679,22681,22683,22685,22687],{"class":114,"line":135},[112,22678,277],{"class":229},[112,22680,351],{"class":129},[112,22682,354],{"class":229},[112,22684,357],{"class":229},[112,22686,360],{"class":118},[112,22688,363],{"class":236},[112,22690,22691],{"class":114,"line":147},[112,22692,12770],{"class":236},[112,22694,22695,22697,22699],{"class":114,"line":202},[112,22696,12775],{"class":236},[112,22698,12778],{"class":122},[112,22700,288],{"class":236},[112,22702,22703],{"class":114,"line":208},[112,22704,988],{"class":236},[112,22706,22707],{"class":114,"line":291},[112,22708,384],{"class":236},[112,22710,22711],{"class":114,"line":299},[112,22712,272],{"emptyLinePlaceholder":271},[112,22714,22715,22717,22719,22721,22724,22726,22728,22730,22732],{"class":114,"line":307},[112,22716,503],{"class":229},[112,22718,506],{"class":229},[112,22720,509],{"class":229},[112,22722,22723],{"class":118}," getCustomers",[112,22725,456],{"class":236},[112,22727,518],{"class":517},[112,22729,171],{"class":229},[112,22731,523],{"class":129},[112,22733,526],{"class":236},[112,22735,22736,22738,22740,22743,22746],{"class":114,"line":315},[112,22737,572],{"class":229},[112,22739,539],{"class":229},[112,22741,22742],{"class":236}," sdk.accounting.",[112,22744,22745],{"class":118},"listAccountingContacts",[112,22747,363],{"class":236},[112,22749,22750],{"class":114,"line":323},[112,22751,15585],{"class":236},[112,22753,22754],{"class":114,"line":329},[112,22755,15149],{"class":236},[112,22757,22758],{"class":114,"line":341},[112,22759,584],{"class":236},[19,22761,22762,22763,16403],{},"The connection_id comes in from your end user's authorization of their accounting app and is stored on your end. You can watch our ",[12408,22764],{"width":12410,"height":12411,"src":16555,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},[19,22766,22767,22768,2251,22771,634],{},"If you need to create a new customer, use our ",[109,22769,22770],{},"createCustomer",[1614,22772,16443],{"href":22773,"rel":22774},"https://docs.unified.to/accounting/customer/Create_a_customer",[1618],[19,22776,9638,22777,16561,22779,16564,22781,1046,22783,22786,22787,16579],{},[109,22778,2156],{},[109,22780,637],{},[109,22782,654],{},[109,22784,22785],{},"billing_address",", and tax information that will be relevant to your software.  See our ",[1614,22788,22791],{"href":22789,"rel":22790},"https://docs.unified.to/accounting/customer/model",[1618],"API Documentation page",[19,22793,22794],{},[1603,22795],{"alt":11593,"src":22796},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_invoicing_system_with_unified-1.png",[19,22798,22799],{},[478,22800,22801],{},"Products",[19,22803,22804,22805,22808,22809,22812,22813,634],{},"Much like getting a list of existing customers, it is easy to get a list of existing products in your end user's accounting app using the ",[109,22806,22807],{},"listItems"," API endpoint. We call a product, an ",[109,22810,22811],{},"Item",", and you can find the full data-model on our ",[1614,22814,22791],{"href":22815,"rel":22816},"https://docs.unified.to/accounting/item/model",[1618],[102,22818,22820],{"className":220,"code":22819,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function getItems(connectionId: string) {\n    return await sdk.commerce.listCommerceItems({\n        connectionId,\n    });\n}\n",[109,22821,22822,22834,22838,22852,22856,22864,22868,22872,22876,22897,22909,22913,22917],{"__ignoreMap":107},[112,22823,22824,22826,22828,22830,22832],{"class":114,"line":115},[112,22825,230],{"class":229},[112,22827,244],{"class":236},[112,22829,247],{"class":229},[112,22831,250],{"class":122},[112,22833,237],{"class":236},[112,22835,22836],{"class":114,"line":126},[112,22837,272],{"emptyLinePlaceholder":271},[112,22839,22840,22842,22844,22846,22848,22850],{"class":114,"line":135},[112,22841,277],{"class":229},[112,22843,351],{"class":129},[112,22845,354],{"class":229},[112,22847,357],{"class":229},[112,22849,360],{"class":118},[112,22851,363],{"class":236},[112,22853,22854],{"class":114,"line":147},[112,22855,12770],{"class":236},[112,22857,22858,22860,22862],{"class":114,"line":202},[112,22859,12775],{"class":236},[112,22861,12778],{"class":122},[112,22863,288],{"class":236},[112,22865,22866],{"class":114,"line":208},[112,22867,988],{"class":236},[112,22869,22870],{"class":114,"line":291},[112,22871,384],{"class":236},[112,22873,22874],{"class":114,"line":299},[112,22875,272],{"emptyLinePlaceholder":271},[112,22877,22878,22880,22882,22884,22887,22889,22891,22893,22895],{"class":114,"line":307},[112,22879,503],{"class":229},[112,22881,506],{"class":229},[112,22883,509],{"class":229},[112,22885,22886],{"class":118}," getItems",[112,22888,456],{"class":236},[112,22890,518],{"class":517},[112,22892,171],{"class":229},[112,22894,523],{"class":129},[112,22896,526],{"class":236},[112,22898,22899,22901,22903,22905,22907],{"class":114,"line":315},[112,22900,572],{"class":229},[112,22902,539],{"class":229},[112,22904,22161],{"class":236},[112,22906,22312],{"class":118},[112,22908,363],{"class":236},[112,22910,22911],{"class":114,"line":323},[112,22912,15585],{"class":236},[112,22914,22915],{"class":114,"line":329},[112,22916,15149],{"class":236},[112,22918,22919],{"class":114,"line":341},[112,22920,584],{"class":236},[19,22922,22923],{},[478,22924,22925],{},"Chart of accounts & tax rates",[19,22927,22928],{},"Each line item in an invoice will be associated with a customer, item, account and tax rate in your end user's accounting application.",[19,22930,22931,22932,2251,22935,22939],{},"You can get a list of accounts by calling our ",[109,22933,22934],{},"listAccounts",[1614,22936,16443],{"href":22937,"rel":22938},"https://docs.unified.to/accounting/account/List_all_accounts",[1618]," which returns a list from their 'Chart of Accounts'.",[19,22941,22942,22943,2251,22946,634],{},"You can also get a list of tax rates by calling our ",[109,22944,22945],{},"listTaxrates",[1614,22947,16443],{"href":22948,"rel":22949},"https://docs.unified.to/accounting/taxrate/List_all_taxrates",[1618],[19,22951,22952],{},[478,22953,22954],{},"Invoices",[19,22956,22957],{},"Once the end user has created an invoice, you will want to send that invoice into their accounting system as well.",[19,22959,22960,22961,2251,22964,634],{},"This is easily accomplished by using the ",[109,22962,22963],{},"createInvoice",[1614,22965,16443],{"href":22966,"rel":22967},"https://docs.unified.to/accounting/invoice/Create_a_invoice",[1618],[102,22969,22971],{"className":220,"code":22970,"language":222,"meta":107,"style":107},"import { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AccountingInvoice } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function createInvoice(connectionId: string, invoice: AccountingInvoice) {\n    const result = await sdk.accounting.createAccountingInvoice({\n        accountingInvoice: invoice,\n        connectionId,\n    });\n    return result.accountingInvoice?.id;\n}\n",[109,22972,22973,22985,22998,23002,23016,23020,23028,23032,23036,23040,23071,23088,23093,23097,23101,23108],{"__ignoreMap":107},[112,22974,22975,22977,22979,22981,22983],{"class":114,"line":115},[112,22976,230],{"class":229},[112,22978,244],{"class":236},[112,22980,247],{"class":229},[112,22982,250],{"class":122},[112,22984,237],{"class":236},[112,22986,22987,22989,22992,22994,22996],{"class":114,"line":126},[112,22988,230],{"class":229},[112,22990,22991],{"class":236}," { AccountingInvoice } ",[112,22993,247],{"class":229},[112,22995,14311],{"class":122},[112,22997,237],{"class":236},[112,22999,23000],{"class":114,"line":135},[112,23001,272],{"emptyLinePlaceholder":271},[112,23003,23004,23006,23008,23010,23012,23014],{"class":114,"line":147},[112,23005,277],{"class":229},[112,23007,351],{"class":129},[112,23009,354],{"class":229},[112,23011,357],{"class":229},[112,23013,360],{"class":118},[112,23015,363],{"class":236},[112,23017,23018],{"class":114,"line":202},[112,23019,12770],{"class":236},[112,23021,23022,23024,23026],{"class":114,"line":208},[112,23023,12775],{"class":236},[112,23025,12778],{"class":122},[112,23027,288],{"class":236},[112,23029,23030],{"class":114,"line":291},[112,23031,988],{"class":236},[112,23033,23034],{"class":114,"line":299},[112,23035,384],{"class":236},[112,23037,23038],{"class":114,"line":307},[112,23039,272],{"emptyLinePlaceholder":271},[112,23041,23042,23044,23046,23048,23051,23053,23055,23057,23059,23061,23064,23066,23069],{"class":114,"line":315},[112,23043,503],{"class":229},[112,23045,506],{"class":229},[112,23047,509],{"class":229},[112,23049,23050],{"class":118}," createInvoice",[112,23052,456],{"class":236},[112,23054,518],{"class":517},[112,23056,171],{"class":229},[112,23058,523],{"class":129},[112,23060,1046],{"class":236},[112,23062,23063],{"class":517},"invoice",[112,23065,171],{"class":229},[112,23067,23068],{"class":118}," AccountingInvoice",[112,23070,526],{"class":236},[112,23072,23073,23075,23077,23079,23081,23083,23086],{"class":114,"line":323},[112,23074,1435],{"class":229},[112,23076,911],{"class":129},[112,23078,354],{"class":229},[112,23080,539],{"class":229},[112,23082,22742],{"class":236},[112,23084,23085],{"class":118},"createAccountingInvoice",[112,23087,363],{"class":236},[112,23089,23090],{"class":114,"line":329},[112,23091,23092],{"class":236},"        accountingInvoice: invoice,\n",[112,23094,23095],{"class":114,"line":341},[112,23096,15585],{"class":236},[112,23098,23099],{"class":114,"line":346},[112,23100,15149],{"class":236},[112,23102,23103,23105],{"class":114,"line":366},[112,23104,572],{"class":229},[112,23106,23107],{"class":236}," result.accountingInvoice?.id;\n",[112,23109,23110],{"class":114,"line":381},[112,23111,584],{"class":236},[67,23113,23115],{"id":23114},"step-2-paying-invoices","Step 2: Paying invoices",[19,23117,23118,23119,2251,23122,23126],{},"Once that invoice is paid, you will need to communicate this to the accounting application. This is accomplished by using the ",[109,23120,23121],{},"createPayment",[1614,23123,16443],{"href":23124,"rel":23125},"https://docs.unified.to/accounting/payment/Create_a_payment",[1618]," which associates a payment with an invoice.",[19,23128,23129,23130,23133,23134,23137,23138,23141,23142,23144,23145,23150,23151,23153],{},"At a minimum, a ",[109,23131,23132],{},"Payment"," will need an ",[109,23135,23136],{},"invoice_id"," , a ",[109,23139,23140],{},"customer_id"," and an ",[109,23143,20816],{},".  Some integrations may require additional values to be present, so check that ",[1614,23146,23149],{"href":23147,"rel":23148},"https://app.unified.to/integrations/quickbooks?tab=support",[1618],"integration's feature support page",".  For example, Quickbooks also requires a ",[109,23152,20825],{}," field.",[67,23155,16927],{"id":16926},[19,23157,23158,23159,23164],{},"It's easy to support multiple accounting applications in your invoicing app and allow your end user to seamlessly move data between the two. By using Unitied.to's ",[1614,23160,23163],{"href":23161,"rel":23162},"https://unified.to/accounting",[1618],"Unified Accounting API"," you can add accounting integrations to your product and support your invoicing use case within days.",[67,23166,23167],{"id":16938},"Additional Resources",[72,23169,23170,23175,23182,23187,23191],{},[46,23171,23172],{},[1614,23173,23163],{"href":23161,"rel":23174},[1618],[46,23176,23177],{},[1614,23178,23181],{"href":23179,"rel":23180},"https://docs.unified.to/accounting/overview",[1618],"API Documentation for the Unified Accounting API",[46,23183,23184],{},[1614,23185,16959],{"href":12471,"rel":23186},[1618],[46,23188,23189],{},[12408,23190],{"width":12410,"height":12411,"src":16402,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},[46,23192,23193],{},[12408,23194],{"width":12410,"height":12411,"src":16555,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},[1558,23196,16970],{},{"title":107,"searchDepth":126,"depth":126,"links":23198},[23199,23200,23201,23202,23203,23204],{"id":69,"depth":126,"text":70},{"id":9689,"depth":126,"text":9690},{"id":22628,"depth":126,"text":22629},{"id":23114,"depth":126,"text":23115},{"id":16926,"depth":126,"text":16927},{"id":16938,"depth":126,"text":23167},"When building a SaaS app for invoicing, you'll need to exchange data within your customers' accounting app of choice. In this guide, we'll cover the basics of...",{"img":23207,"date":23208,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_invoicing_system_with_unified-icon.png","2024-01-03T00:00:00.000Z","/guides/how_to_build_an_invoicing_system_with_unified",{"title":22567,"description":23205},"guides/how_to_build_an_invoicing_system_with_unified","RPd4_Y6akIfj7X0nTZRWtxe32kXq_w8o94irXn5CWJ8",{"id":23214,"title":23215,"body":23216,"description":25308,"extension":1576,"meta":25309,"navigation":271,"path":25312,"seo":25313,"stem":25314,"__hash__":25315},"guides/guides/how_to_build_enterprise_search_using_rag.md","How to build Enterprise Search using RAG",{"type":9,"value":23217,"toc":25294},[23218,23221,23223,23228,23231,23239,23242,23262,23266,23283,23289,23343,23348,23371,23375,23464,23470,23473,23752,23758,23761,24052,24058,24061,24129,24135,24143,24147,24150,24188,24191,24194,24226,24229,24370,24376,24379,24385,24388,24391,24644,24650,24653,24656,24674,24677,25217,25223,25288,25291],[12,23219,23215],{"id":23220},"how-to-build-enterprise-search-using-rag",[16,23222],{},[19,23224,23225],{},[22,23226,23227],{},"November 19, 2025",[19,23229,23230],{},"In this article, we will be going into detail on how to build an enterprise search application as well as a Q&A bot using a RAG pipeline with Unified's data integrations and OpenAI embedding models.",[19,23232,23233,23238],{},[1614,23234,23237],{"href":23235,"rel":23236},"https://developer.nvidia.com/blog/rag-101-demystifying-retrieval-augmented-generation-pipelines/",[1618],"RAG"," or Retrieval-Augmented-Generation is a powerful approach that can be leveraged to take a large amount of information and index it efficiently so that it can be searched quickly. This design pattern is very beneficial for enterprise search, Q&A bots, or any agent. A Q&A bot can be used to answer questions across a company's knowledge base, while an enterprise search application can be used to search corporate information from any internal data source.",[12408,23240],{"width":12410,"height":12411,"src":23241,"title":12413,"frameBorder":660,"allow":12414,"referrerPolicy":13521,"allowFullScreen":271},"https://www.youtube.com/embed/yymVcO6T6Vs",[19,23243,23244,23245,23250,23251,23255,23256,23261],{},"We will be using a few of Unified.to's integrations to access internal company knowledge in ",[1614,23246,23249],{"href":23247,"rel":23248},"https://unified.to/storage",[1618],"file storage"," (eg. Google Drive) and ",[1614,23252,23254],{"href":17092,"rel":23253},[1618],"knowledge management systems"," (eg. Notion), embed their content using ",[1614,23257,23260],{"href":23258,"rel":23259},"https://unified.to/genai",[1618],"OpenAI's models",", and then store them in a vector DB and used to answer questions.",[67,23263,23264],{"id":69},[478,23265,70],{},[72,23267,23268,23271,23274,23277,23280],{},[46,23269,23270],{},"Node.js 19+",[46,23272,23273],{},"Unified account with integrations enabled for Google Drive and Notion",[46,23275,23276],{},"Unified.to API key and GenAI Connection ID",[46,23278,23279],{},"OpenAI API key (As we are using OpenAI for embedding)",[46,23281,23282],{},"A vector DB (eg. Pinecone, or Chroma. For the demo we are using a in memory vector store)",[67,23284,23286],{"id":23285},"step-1-setting-your-project-up",[478,23287,23288],{},"Step 1: Setting your project up",[102,23290,23292],{"className":220,"code":23291,"language":222,"meta":107,"style":107},"mkdir rag-bot\ncd rag-bot\nnpm init -y\nnpm install dotenv @unified-api/typescript-sdk\n",[109,23293,23294,23305,23314,23324],{"__ignoreMap":107},[112,23295,23296,23299,23302],{"class":114,"line":115},[112,23297,23298],{"class":236},"mkdir rag",[112,23300,23301],{"class":229},"-",[112,23303,23304],{"class":236},"bot\n",[112,23306,23307,23310,23312],{"class":114,"line":126},[112,23308,23309],{"class":236},"cd rag",[112,23311,23301],{"class":229},[112,23313,23304],{"class":236},[112,23315,23316,23319,23321],{"class":114,"line":135},[112,23317,23318],{"class":236},"npm init ",[112,23320,23301],{"class":229},[112,23322,23323],{"class":236},"y\n",[112,23325,23326,23329,23331,23334,23336,23338,23340],{"class":114,"line":147},[112,23327,23328],{"class":236},"npm install dotenv @unified",[112,23330,23301],{"class":229},[112,23332,23333],{"class":236},"api",[112,23335,12874],{"class":229},[112,23337,222],{"class":236},[112,23339,23301],{"class":229},[112,23341,23342],{"class":236},"sdk\n",[19,23344,23345,23346,171],{},"Add your credentials and keys to the ",[109,23347,170],{},[102,23349,23351],{"className":174,"code":23350,"language":176,"meta":177,"style":107},"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_GOOGLEDRIVE=your_gdrive_connection_id\nCONNECTION_NOTION=your_notion_connection_id\nCONNECTION_GENAI=your_genai_connection_id\n",[109,23352,23353,23357,23362,23367],{"__ignoreMap":107},[112,23354,23355],{"class":114,"line":115},[112,23356,184],{},[112,23358,23359],{"class":114,"line":126},[112,23360,23361],{},"CONNECTION_GOOGLEDRIVE=your_gdrive_connection_id\n",[112,23363,23364],{"class":114,"line":135},[112,23365,23366],{},"CONNECTION_NOTION=your_notion_connection_id\n",[112,23368,23369],{"class":114,"line":147},[112,23370,194],{},[67,23372,23373],{"id":20611},[478,23374,20612],{},[102,23376,23378],{"className":220,"code":23377,"language":222,"meta":107,"style":107},"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_GOOGLEDRIVE, CONNECTION_NOTION, CONNECTION_GENAI } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[109,23379,23380,23388,23400,23404,23432,23436,23450,23460],{"__ignoreMap":107},[112,23381,23382,23384,23386],{"class":114,"line":115},[112,23383,230],{"class":229},[112,23385,233],{"class":122},[112,23387,237],{"class":236},[112,23389,23390,23392,23394,23396,23398],{"class":114,"line":126},[112,23391,230],{"class":229},[112,23393,244],{"class":236},[112,23395,247],{"class":229},[112,23397,250],{"class":122},[112,23399,237],{"class":236},[112,23401,23402],{"class":114,"line":135},[112,23403,272],{"emptyLinePlaceholder":271},[112,23405,23406,23408,23410,23412,23414,23417,23419,23422,23424,23426,23428,23430],{"class":114,"line":147},[112,23407,277],{"class":229},[112,23409,18780],{"class":236},[112,23411,372],{"class":129},[112,23413,1046],{"class":236},[112,23415,23416],{"class":129},"CONNECTION_GOOGLEDRIVE",[112,23418,1046],{"class":236},[112,23420,23421],{"class":129},"CONNECTION_NOTION",[112,23423,1046],{"class":236},[112,23425,931],{"class":129},[112,23427,18801],{"class":236},[112,23429,335],{"class":229},[112,23431,338],{"class":236},[112,23433,23434],{"class":114,"line":202},[112,23435,272],{"emptyLinePlaceholder":271},[112,23437,23438,23440,23442,23444,23446,23448],{"class":114,"line":208},[112,23439,277],{"class":229},[112,23441,351],{"class":129},[112,23443,354],{"class":229},[112,23445,357],{"class":229},[112,23447,360],{"class":118},[112,23449,363],{"class":236},[112,23451,23452,23454,23456,23458],{"class":114,"line":291},[112,23453,369],{"class":236},[112,23455,372],{"class":129},[112,23457,375],{"class":229},[112,23459,378],{"class":236},[112,23461,23462],{"class":114,"line":299},[112,23463,384],{"class":236},[67,23465,23467],{"id":23466},"step-3-fetch-all-the-files-from-google-drive",[478,23468,23469],{},"Step 3: Fetch all the files from Google Drive",[19,23471,23472],{},"We will now use Unified's storage API to retrieve files from a Google Drive.",[102,23474,23476],{"className":220,"code":23475,"language":222,"meta":107,"style":107},"async function getAllGoogleDriveFiles(connectionId: string) {\n  const files: any[] = [];\n    let offset = 0;\n    const limit = 100;\n    let hasMore = true;\n    while (hasMore) {\n          const response = await sdk.storage.listStorageFiles({\n            connectionId,\n            offset,\n            limit,\n          });\n            pages.push(...(response.files || []));\n          hasMore = (response.files?.length || 0) === limit;\n          offset += limit;\n        }\n\n      return files;\n    }\n\n    const file = await sdk.storage.getStorageFile({ connectionId, id: fileId });\n\n    const downloadUrl = file.download_url;\n\n    const content = await fetch(downloadUrl).then(res => res.text());\n\n    return content;\n}\n",[109,23477,23478,23497,23514,23526,23538,23552,23559,23578,23582,23586,23590,23595,23614,23636,23645,23649,23653,23661,23665,23669,23688,23692,23704,23708,23737,23741,23748],{"__ignoreMap":107},[112,23479,23480,23482,23484,23487,23489,23491,23493,23495],{"class":114,"line":115},[112,23481,1377],{"class":229},[112,23483,509],{"class":229},[112,23485,23486],{"class":118}," getAllGoogleDriveFiles",[112,23488,456],{"class":236},[112,23490,518],{"class":517},[112,23492,171],{"class":229},[112,23494,523],{"class":129},[112,23496,526],{"class":236},[112,23498,23499,23501,23504,23506,23508,23510,23512],{"class":114,"line":126},[112,23500,531],{"class":229},[112,23502,23503],{"class":129}," files",[112,23505,171],{"class":229},[112,23507,607],{"class":129},[112,23509,14419],{"class":236},[112,23511,335],{"class":229},[112,23513,1292],{"class":236},[112,23515,23516,23518,23520,23522,23524],{"class":114,"line":135},[112,23517,14442],{"class":229},[112,23519,14445],{"class":236},[112,23521,335],{"class":229},[112,23523,14450],{"class":129},[112,23525,237],{"class":236},[112,23527,23528,23530,23532,23534,23536],{"class":114,"line":147},[112,23529,1435],{"class":229},[112,23531,14430],{"class":129},[112,23533,354],{"class":229},[112,23535,14435],{"class":129},[112,23537,237],{"class":236},[112,23539,23540,23542,23545,23547,23550],{"class":114,"line":202},[112,23541,14442],{"class":229},[112,23543,23544],{"class":236}," hasMore ",[112,23546,335],{"class":229},[112,23548,23549],{"class":129}," true",[112,23551,237],{"class":236},[112,23553,23554,23556],{"class":114,"line":208},[112,23555,14461],{"class":229},[112,23557,23558],{"class":236}," (hasMore) {\n",[112,23560,23561,23564,23566,23568,23570,23573,23576],{"class":114,"line":291},[112,23562,23563],{"class":229},"          const",[112,23565,17600],{"class":129},[112,23567,354],{"class":229},[112,23569,539],{"class":229},[112,23571,23572],{"class":236}," sdk.storage.",[112,23574,23575],{"class":118},"listStorageFiles",[112,23577,363],{"class":236},[112,23579,23580],{"class":114,"line":299},[112,23581,14510],{"class":236},[112,23583,23584],{"class":114,"line":307},[112,23585,14500],{"class":236},[112,23587,23588],{"class":114,"line":315},[112,23589,14505],{"class":236},[112,23591,23592],{"class":114,"line":323},[112,23593,23594],{"class":236},"          });\n",[112,23596,23597,23600,23602,23604,23606,23609,23611],{"class":114,"line":329},[112,23598,23599],{"class":236},"            pages.",[112,23601,14547],{"class":118},[112,23603,456],{"class":236},[112,23605,14552],{"class":229},[112,23607,23608],{"class":236},"(response.files ",[112,23610,1109],{"class":229},[112,23612,23613],{"class":236}," []));\n",[112,23615,23616,23619,23621,23624,23626,23628,23630,23632,23634],{"class":114,"line":341},[112,23617,23618],{"class":236},"          hasMore ",[112,23620,335],{"class":229},[112,23622,23623],{"class":236}," (response.files?.",[112,23625,14591],{"class":129},[112,23627,669],{"class":229},[112,23629,14450],{"class":129},[112,23631,745],{"class":236},[112,23633,14573],{"class":229},[112,23635,14608],{"class":236},[112,23637,23638,23641,23643],{"class":114,"line":346},[112,23639,23640],{"class":236},"          offset ",[112,23642,14605],{"class":229},[112,23644,14608],{"class":236},[112,23646,23647],{"class":114,"line":366},[112,23648,4052],{"class":236},[112,23650,23651],{"class":114,"line":381},[112,23652,272],{"emptyLinePlaceholder":271},[112,23654,23655,23658],{"class":114,"line":387},[112,23656,23657],{"class":229},"      return",[112,23659,23660],{"class":236}," files;\n",[112,23662,23663],{"class":114,"line":392},[112,23664,3946],{"class":236},[112,23666,23667],{"class":114,"line":409},[112,23668,272],{"emptyLinePlaceholder":271},[112,23670,23671,23673,23676,23678,23680,23682,23685],{"class":114,"line":422},[112,23672,1435],{"class":229},[112,23674,23675],{"class":129}," file",[112,23677,354],{"class":229},[112,23679,539],{"class":229},[112,23681,23572],{"class":236},[112,23683,23684],{"class":118},"getStorageFile",[112,23686,23687],{"class":236},"({ connectionId, id: fileId });\n",[112,23689,23690],{"class":114,"line":435},[112,23691,272],{"emptyLinePlaceholder":271},[112,23693,23694,23696,23699,23701],{"class":114,"line":440},[112,23695,1435],{"class":229},[112,23697,23698],{"class":129}," downloadUrl",[112,23700,354],{"class":229},[112,23702,23703],{"class":236}," file.download_url;\n",[112,23705,23706],{"class":114,"line":4949},[112,23707,272],{"emptyLinePlaceholder":271},[112,23709,23710,23712,23714,23716,23718,23720,23723,23725,23727,23729,23731,23733,23735],{"class":114,"line":4960},[112,23711,1435],{"class":229},[112,23713,17897],{"class":129},[112,23715,354],{"class":229},[112,23717,539],{"class":229},[112,23719,17607],{"class":118},[112,23721,23722],{"class":236},"(downloadUrl).",[112,23724,18193],{"class":118},[112,23726,456],{"class":236},[112,23728,13855],{"class":517},[112,23730,18200],{"class":229},[112,23732,18203],{"class":236},[112,23734,177],{"class":118},[112,23736,13917],{"class":236},[112,23738,23739],{"class":114,"line":4972},[112,23740,272],{"emptyLinePlaceholder":271},[112,23742,23743,23745],{"class":114,"line":4984},[112,23744,572],{"class":229},[112,23746,23747],{"class":236}," content;\n",[112,23749,23750],{"class":114,"line":4992},[112,23751,584],{"class":236},[67,23753,23755],{"id":23754},"step-4-fetch-notion-pages",[478,23756,23757],{},"Step 4: Fetch Notion Pages",[19,23759,23760],{},"Now that we have the data from Google Drive, we will use Unified's connection to Notion to fetch data from Notion as well.",[102,23762,23764],{"className":220,"code":23763,"language":222,"meta":107,"style":107},"async function getAllNotionPages(connectionId: string) {\n  const pages: any[] = [];\n    let offset = 0;\n    const limit = 100;\n    let hasMore = true;\n    while (hasMore) {\n      const response = await sdk.storage.listStorageFiles({\n        connectionId,\n        offset,\n        limit,\n      });\n      files.push(...(response.files || []));\n      hasMore = (response.files?.length || 0) === limit;\n      offset += limit;\n    }\n\n  return pages;\n}\n\nasync function getNotionPageContent(connectionId: string, pageId: string) {\n  const page = await sdk.kms.getKmsPage({\n    connectionId,\n    id: pageId,\n  });\n\n const content = await fetch(page.download_url).then(r => r.text());\n return content;\n}\n",[109,23765,23766,23785,23801,23813,23825,23837,23843,23859,23863,23868,23873,23877,23894,23915,23924,23928,23932,23939,23943,23947,23975,23993,23997,24002,24006,24010,24041,24048],{"__ignoreMap":107},[112,23767,23768,23770,23772,23775,23777,23779,23781,23783],{"class":114,"line":115},[112,23769,1377],{"class":229},[112,23771,509],{"class":229},[112,23773,23774],{"class":118}," getAllNotionPages",[112,23776,456],{"class":236},[112,23778,518],{"class":517},[112,23780,171],{"class":229},[112,23782,523],{"class":129},[112,23784,526],{"class":236},[112,23786,23787,23789,23791,23793,23795,23797,23799],{"class":114,"line":126},[112,23788,531],{"class":229},[112,23790,17520],{"class":129},[112,23792,171],{"class":229},[112,23794,607],{"class":129},[112,23796,14419],{"class":236},[112,23798,335],{"class":229},[112,23800,1292],{"class":236},[112,23802,23803,23805,23807,23809,23811],{"class":114,"line":135},[112,23804,14442],{"class":229},[112,23806,14445],{"class":236},[112,23808,335],{"class":229},[112,23810,14450],{"class":129},[112,23812,237],{"class":236},[112,23814,23815,23817,23819,23821,23823],{"class":114,"line":147},[112,23816,1435],{"class":229},[112,23818,14430],{"class":129},[112,23820,354],{"class":229},[112,23822,14435],{"class":129},[112,23824,237],{"class":236},[112,23826,23827,23829,23831,23833,23835],{"class":114,"line":202},[112,23828,14442],{"class":229},[112,23830,23544],{"class":236},[112,23832,335],{"class":229},[112,23834,23549],{"class":129},[112,23836,237],{"class":236},[112,23838,23839,23841],{"class":114,"line":208},[112,23840,14461],{"class":229},[112,23842,23558],{"class":236},[112,23844,23845,23847,23849,23851,23853,23855,23857],{"class":114,"line":291},[112,23846,20035],{"class":229},[112,23848,17600],{"class":129},[112,23850,354],{"class":229},[112,23852,539],{"class":229},[112,23854,23572],{"class":236},[112,23856,23575],{"class":118},[112,23858,363],{"class":236},[112,23860,23861],{"class":114,"line":299},[112,23862,15585],{"class":236},[112,23864,23865],{"class":114,"line":307},[112,23866,23867],{"class":236},"        offset,\n",[112,23869,23870],{"class":114,"line":315},[112,23871,23872],{"class":236},"        limit,\n",[112,23874,23875],{"class":114,"line":323},[112,23876,20069],{"class":236},[112,23878,23879,23882,23884,23886,23888,23890,23892],{"class":114,"line":329},[112,23880,23881],{"class":236},"      files.",[112,23883,14547],{"class":118},[112,23885,456],{"class":236},[112,23887,14552],{"class":229},[112,23889,23608],{"class":236},[112,23891,1109],{"class":229},[112,23893,23613],{"class":236},[112,23895,23896,23899,23901,23903,23905,23907,23909,23911,23913],{"class":114,"line":341},[112,23897,23898],{"class":236},"      hasMore ",[112,23900,335],{"class":229},[112,23902,23623],{"class":236},[112,23904,14591],{"class":129},[112,23906,669],{"class":229},[112,23908,14450],{"class":129},[112,23910,745],{"class":236},[112,23912,14573],{"class":229},[112,23914,14608],{"class":236},[112,23916,23917,23920,23922],{"class":114,"line":346},[112,23918,23919],{"class":236},"      offset ",[112,23921,14605],{"class":229},[112,23923,14608],{"class":236},[112,23925,23926],{"class":114,"line":366},[112,23927,3946],{"class":236},[112,23929,23930],{"class":114,"line":381},[112,23931,272],{"emptyLinePlaceholder":271},[112,23933,23934,23936],{"class":114,"line":387},[112,23935,621],{"class":229},[112,23937,23938],{"class":236}," pages;\n",[112,23940,23941],{"class":114,"line":392},[112,23942,584],{"class":236},[112,23944,23945],{"class":114,"line":409},[112,23946,272],{"emptyLinePlaceholder":271},[112,23948,23949,23951,23953,23956,23958,23960,23962,23964,23966,23969,23971,23973],{"class":114,"line":422},[112,23950,1377],{"class":229},[112,23952,509],{"class":229},[112,23954,23955],{"class":118}," getNotionPageContent",[112,23957,456],{"class":236},[112,23959,518],{"class":517},[112,23961,171],{"class":229},[112,23963,523],{"class":129},[112,23965,1046],{"class":236},[112,23967,23968],{"class":517},"pageId",[112,23970,171],{"class":229},[112,23972,523],{"class":129},[112,23974,526],{"class":236},[112,23976,23977,23979,23981,23983,23985,23988,23991],{"class":114,"line":435},[112,23978,531],{"class":229},[112,23980,9903],{"class":129},[112,23982,354],{"class":229},[112,23984,539],{"class":229},[112,23986,23987],{"class":236}," sdk.kms.",[112,23989,23990],{"class":118},"getKmsPage",[112,23992,363],{"class":236},[112,23994,23995],{"class":114,"line":440},[112,23996,552],{"class":236},[112,23998,23999],{"class":114,"line":4949},[112,24000,24001],{"class":236},"    id: pageId,\n",[112,24003,24004],{"class":114,"line":4960},[112,24005,567],{"class":236},[112,24007,24008],{"class":114,"line":4972},[112,24009,272],{"emptyLinePlaceholder":271},[112,24011,24012,24015,24017,24019,24021,24023,24025,24027,24029,24032,24034,24037,24039],{"class":114,"line":4984},[112,24013,24014],{"class":229}," const",[112,24016,17897],{"class":129},[112,24018,354],{"class":229},[112,24020,539],{"class":229},[112,24022,17607],{"class":118},[112,24024,18190],{"class":236},[112,24026,18193],{"class":118},[112,24028,456],{"class":236},[112,24030,24031],{"class":517},"r",[112,24033,18200],{"class":229},[112,24035,24036],{"class":236}," r.",[112,24038,177],{"class":118},[112,24040,13917],{"class":236},[112,24042,24043,24046],{"class":114,"line":4992},[112,24044,24045],{"class":229}," return",[112,24047,23747],{"class":236},[112,24049,24050],{"class":114,"line":5000},[112,24051,584],{"class":236},[67,24053,24055],{"id":24054},"step-5-building-the-vector-db",[478,24056,24057],{},"Step 5: Building the vector DB",[19,24059,24060],{},"For the purpose of the demo, we will be creating a simple in memory vector store. But for production, you would use a cloud-based vector database like Pinecone, Chroma or Weaviate.",[102,24062,24064],{"className":220,"code":24063,"language":222,"meta":107,"style":107},"type Document = { id: string; source: string; content: string; embedding?: number[] };\nconst vectorDB: Document[] = [];\n",[109,24065,24066,24112],{"__ignoreMap":107},[112,24067,24068,24070,24073,24075,24077,24079,24081,24083,24085,24088,24090,24092,24094,24097,24099,24101,24103,24105,24107,24109],{"class":114,"line":115},[112,24069,2472],{"class":229},[112,24071,24072],{"class":118}," Document",[112,24074,354],{"class":229},[112,24076,18780],{"class":236},[112,24078,2442],{"class":517},[112,24080,171],{"class":229},[112,24082,523],{"class":129},[112,24084,10369],{"class":236},[112,24086,24087],{"class":517},"source",[112,24089,171],{"class":229},[112,24091,523],{"class":129},[112,24093,10369],{"class":236},[112,24095,24096],{"class":517},"content",[112,24098,171],{"class":229},[112,24100,523],{"class":129},[112,24102,10369],{"class":236},[112,24104,1049],{"class":517},[112,24106,10309],{"class":229},[112,24108,1054],{"class":129},[112,24110,24111],{"class":236},"[] };\n",[112,24113,24114,24116,24119,24121,24123,24125,24127],{"class":114,"line":126},[112,24115,277],{"class":229},[112,24117,24118],{"class":129}," vectorDB",[112,24120,171],{"class":229},[112,24122,24072],{"class":118},[112,24124,14419],{"class":236},[112,24126,335],{"class":229},[112,24128,1292],{"class":236},[67,24130,24132],{"id":24131},"step-6-embedding-the-documents",[478,24133,24134],{},"Step 6: Embedding the documents",[19,24136,24137,24138,24142],{},"For the purpose of the example, we will be using OpenAI as the embedding provider in this step.  Unified has ",[1614,24139,24141],{"href":23258,"rel":24140},[1618],"many integrations"," that support embedding, but you can also use a single provider's SDK.  Please remember to chunk the content properly and not embed the entire content at once.",[35,24144,24146],{"id":24145},"chunking-strategies","Chunking strategies:",[19,24148,24149],{},"Chunking large documents effectively is super important to maintain context and relevance. Here are a few best practices for chunking:",[43,24151,24152,24158,24164,24170,24176,24182],{},[46,24153,24154,24157],{},[478,24155,24156],{},"Semantic Chunking",": Instead of splitting by fixed lengths, break the document into chunks based on natural language boundaries, like paragraphs or sections, ensuring each chunk is coherent and meaningful.",[46,24159,24160,24163],{},[478,24161,24162],{},"Overlap Between Chunks",": Include a slight overlap between adjacent chunks. This helps maintain continuity and context, especially for complex ideas that span multiple chunks.",[46,24165,24166,24169],{},[478,24167,24168],{},"Fixed-Length Chunking",": If you use fixed-length chunking, aim for a length that balances between too small (losing context) and too large (losing efficiency). Typically, a few hundred tokens per chunk works well.",[46,24171,24172,24175],{},[478,24173,24174],{},"Using Document Structure",": If your document has headings, subheadings, or other structural elements, use those to guide the chunking. This ensures that each chunk is logically complete.",[46,24177,24178,24181],{},[478,24179,24180],{},"Contextual Embeddings",": Sometimes, you can embed the entire document first and then create embeddings for chunks that are derived from the document's embedding, ensuring that each chunk stays contextually relevant.",[46,24183,24184,24187],{},[478,24185,24186],{},"Pre-processing and Cleaning",": Before chunking, clean up the text by removing unnecessary whitespace, special characters, or any irrelevant information to improve the quality of the embeddings.",[19,24189,24190],{},"By following these strategies, you'll maintain the semantic integrity of the document and ensure that the vector database can retrieve meaningful context.",[19,24192,24193],{},"There are several popular libraries that help with chunking and embedding in a streamlined way. A few notable ones include:",[43,24195,24196,24202,24208,24214,24220],{},[46,24197,24198,24201],{},[478,24199,24200],{},"LangChain",": This is a popular framework that integrates various language models and vector databases. It provides built-in utilities for chunking, embedding, and storing data in vector stores.",[46,24203,24204,24207],{},[478,24205,24206],{},"Haystack",": Developed by deepset, Haystack is another robust framework for building search pipelines. It supports intelligent chunking, document retrieval, and integration with vector databases like FAISS, Milvus, and Pinecone.",[46,24209,24210,24213],{},[478,24211,24212],{},"Transformers and Datasets from Hugging Face",": Hugging Face offers tools that can help with both embedding and chunking. You can use their Transformers library for embedding and their Datasets library to preprocess and chunk documents.",[46,24215,24216,24219],{},[478,24217,24218],{},"SentenceTransformers",": This library is great for generating embeddings and can be combined with custom chunking logic to break documents into meaningful pieces before embedding.",[46,24221,24222,24225],{},[478,24223,24224],{},"GPT-Index (formerly LlamaIndex)",": This library is designed to help build large language model applications and provides utilities for chunking, indexing, and querying documents effectively.",[19,24227,24228],{},"These libraries often provide a lot of built-in functionality, making it easier to handle complex documents and ensure that your embeddings and vector storage are efficient and meaningful.",[102,24230,24232],{"className":220,"code":24231,"language":222,"meta":107,"style":107},"import { Configuration, OpenAIApi } from \"openai\";\nconst openai = new OpenAIApi(new Configuration({ apiKey: process.env.OPENAI_API_KEY }));\n\nasync function embedText(text: string): Promise\u003Cnumber[]> {\n  const response = await openai.createEmbedding({\n    model: \"text-embedding-3-large\", //You can choose to use text-embedding-3-small too\n    input: text,\n  });\n  return response.data.data[0].embedding;\n}\n",[109,24233,24234,24248,24279,24283,24314,24332,24345,24350,24354,24366],{"__ignoreMap":107},[112,24235,24236,24238,24241,24243,24246],{"class":114,"line":115},[112,24237,230],{"class":229},[112,24239,24240],{"class":236}," { Configuration, OpenAIApi } ",[112,24242,247],{"class":229},[112,24244,24245],{"class":122}," \"openai\"",[112,24247,237],{"class":236},[112,24249,24250,24252,24255,24257,24259,24262,24264,24267,24270,24273,24276],{"class":114,"line":126},[112,24251,277],{"class":229},[112,24253,24254],{"class":129}," openai",[112,24256,354],{"class":229},[112,24258,357],{"class":229},[112,24260,24261],{"class":118}," OpenAIApi",[112,24263,456],{"class":236},[112,24265,24266],{"class":229},"new",[112,24268,24269],{"class":118}," Configuration",[112,24271,24272],{"class":236},"({ apiKey: process.env.",[112,24274,24275],{"class":129},"OPENAI_API_KEY",[112,24277,24278],{"class":236}," }));\n",[112,24280,24281],{"class":114,"line":135},[112,24282,272],{"emptyLinePlaceholder":271},[112,24284,24285,24287,24289,24292,24294,24296,24298,24300,24302,24304,24307,24309,24311],{"class":114,"line":147},[112,24286,1377],{"class":229},[112,24288,509],{"class":229},[112,24290,24291],{"class":118}," embedText",[112,24293,456],{"class":236},[112,24295,177],{"class":517},[112,24297,171],{"class":229},[112,24299,523],{"class":129},[112,24301,610],{"class":236},[112,24303,171],{"class":229},[112,24305,24306],{"class":118}," Promise",[112,24308,14970],{"class":236},[112,24310,2683],{"class":129},[112,24312,24313],{"class":236},"[]> {\n",[112,24315,24316,24318,24320,24322,24324,24327,24330],{"class":114,"line":202},[112,24317,531],{"class":229},[112,24319,17600],{"class":129},[112,24321,354],{"class":229},[112,24323,539],{"class":229},[112,24325,24326],{"class":236}," openai.",[112,24328,24329],{"class":118},"createEmbedding",[112,24331,363],{"class":236},[112,24333,24334,24337,24340,24342],{"class":114,"line":208},[112,24335,24336],{"class":236},"    model: ",[112,24338,24339],{"class":122},"\"text-embedding-3-large\"",[112,24341,1046],{"class":236},[112,24343,24344],{"class":578},"//You can choose to use text-embedding-3-small too\n",[112,24346,24347],{"class":114,"line":291},[112,24348,24349],{"class":236},"    input: text,\n",[112,24351,24352],{"class":114,"line":299},[112,24353,567],{"class":236},[112,24355,24356,24358,24361,24363],{"class":114,"line":307},[112,24357,621],{"class":229},[112,24359,24360],{"class":236}," response.data.data[",[112,24362,660],{"class":129},[112,24364,24365],{"class":236},"].embedding;\n",[112,24367,24368],{"class":114,"line":315},[112,24369,584],{"class":236},[67,24371,24373],{"id":24372},"step-7-indexing-everything",[478,24374,24375],{},"Step 7: Indexing Everything",[19,24377,24378],{},"Now that we have all the data collected, it is time to index all of it!",[19,24380,24381,24382,24384],{},"When you store vectors in a vector database like Pinecone or Weaviate, you can attach ",[109,24383,4631],{}," to each vector. This metadata can include things like a unique ID, the original text, source information, or any other relevant attributes.",[19,24386,24387],{},"When you perform a similarity search and get the top matching vectors, the database returns the metadata along with the vectors. That way, you can easily link back to the original content.",[19,24389,24390],{},"For instance, when you index a piece of text, you'd store the vector along with metadata like a document ID, the title, or even the source URL. When you retrieve the nearest neighbors, the metadata is returned, and you can use it to identify or fetch the original content from your database or any external source.",[102,24392,24394],{"className":220,"code":24393,"language":222,"meta":107,"style":107},"async function indexAllContent() {\n  // Google Drive\n  const gdriveFiles = await getAllGoogleDriveFiles(CONNECTION_GOOGLEDRIVE!);\n  for (const file of gdriveFiles) {\n    const content = await getFileContent(CONNECTION_GOOGLEDRIVE!, file.id);\n    const embedding = await embedText(content);\n    vectorDB.push({\n            id: file.id,\n            source: \"gdrive\",\n            content,\n            embedding,\n            filename: file.name,\n            date_created: file.created_at,\n            owner_id: file.user_id, \n        });\n    }\n\n  // Notion\n  const notionPages = await getAllNotionPages(CONNECTION_NOTION!);\n  for (const page of notionPages) {\n    const content = await getNotionPageContent(CONNECTION_NOTION!, page.id);\n    const embedding = await embedText(content);\n    vectorDB.push({ id: page.id, source: \"notion\", content, embedding });\n  }\n}\n",[109,24395,24396,24407,24412,24433,24448,24470,24484,24493,24498,24508,24513,24518,24523,24528,24533,24537,24541,24545,24550,24571,24586,24607,24621,24636,24640],{"__ignoreMap":107},[112,24397,24398,24400,24402,24405],{"class":114,"line":115},[112,24399,1377],{"class":229},[112,24401,509],{"class":229},[112,24403,24404],{"class":118}," indexAllContent",[112,24406,1385],{"class":236},[112,24408,24409],{"class":114,"line":126},[112,24410,24411],{"class":578},"  // Google Drive\n",[112,24413,24414,24416,24419,24421,24423,24425,24427,24429,24431],{"class":114,"line":135},[112,24415,531],{"class":229},[112,24417,24418],{"class":129}," gdriveFiles",[112,24420,354],{"class":229},[112,24422,539],{"class":229},[112,24424,23486],{"class":118},[112,24426,456],{"class":236},[112,24428,23416],{"class":129},[112,24430,375],{"class":229},[112,24432,464],{"class":236},[112,24434,24435,24437,24439,24441,24443,24445],{"class":114,"line":147},[112,24436,1416],{"class":229},[112,24438,1419],{"class":236},[112,24440,277],{"class":229},[112,24442,23675],{"class":129},[112,24444,1427],{"class":229},[112,24446,24447],{"class":236}," gdriveFiles) {\n",[112,24449,24450,24452,24454,24456,24458,24461,24463,24465,24467],{"class":114,"line":202},[112,24451,1435],{"class":229},[112,24453,17897],{"class":129},[112,24455,354],{"class":229},[112,24457,539],{"class":229},[112,24459,24460],{"class":118}," getFileContent",[112,24462,456],{"class":236},[112,24464,23416],{"class":129},[112,24466,375],{"class":229},[112,24468,24469],{"class":236},", file.id);\n",[112,24471,24472,24474,24476,24478,24480,24482],{"class":114,"line":208},[112,24473,1435],{"class":229},[112,24475,1452],{"class":129},[112,24477,354],{"class":229},[112,24479,539],{"class":229},[112,24481,24291],{"class":118},[112,24483,18233],{"class":236},[112,24485,24486,24489,24491],{"class":114,"line":291},[112,24487,24488],{"class":236},"    vectorDB.",[112,24490,14547],{"class":118},[112,24492,363],{"class":236},[112,24494,24495],{"class":114,"line":299},[112,24496,24497],{"class":236},"            id: file.id,\n",[112,24499,24500,24503,24506],{"class":114,"line":307},[112,24501,24502],{"class":236},"            source: ",[112,24504,24505],{"class":122},"\"gdrive\"",[112,24507,288],{"class":236},[112,24509,24510],{"class":114,"line":315},[112,24511,24512],{"class":236},"            content,\n",[112,24514,24515],{"class":114,"line":323},[112,24516,24517],{"class":236},"            embedding,\n",[112,24519,24520],{"class":114,"line":329},[112,24521,24522],{"class":236},"            filename: file.name,\n",[112,24524,24525],{"class":114,"line":341},[112,24526,24527],{"class":236},"            date_created: file.created_at,\n",[112,24529,24530],{"class":114,"line":346},[112,24531,24532],{"class":236},"            owner_id: file.user_id, \n",[112,24534,24535],{"class":114,"line":366},[112,24536,14515],{"class":236},[112,24538,24539],{"class":114,"line":381},[112,24540,3946],{"class":236},[112,24542,24543],{"class":114,"line":387},[112,24544,272],{"emptyLinePlaceholder":271},[112,24546,24547],{"class":114,"line":392},[112,24548,24549],{"class":578},"  // Notion\n",[112,24551,24552,24554,24557,24559,24561,24563,24565,24567,24569],{"class":114,"line":409},[112,24553,531],{"class":229},[112,24555,24556],{"class":129}," notionPages",[112,24558,354],{"class":229},[112,24560,539],{"class":229},[112,24562,23774],{"class":118},[112,24564,456],{"class":236},[112,24566,23421],{"class":129},[112,24568,375],{"class":229},[112,24570,464],{"class":236},[112,24572,24573,24575,24577,24579,24581,24583],{"class":114,"line":422},[112,24574,1416],{"class":229},[112,24576,1419],{"class":236},[112,24578,277],{"class":229},[112,24580,9903],{"class":129},[112,24582,1427],{"class":229},[112,24584,24585],{"class":236}," notionPages) {\n",[112,24587,24588,24590,24592,24594,24596,24598,24600,24602,24604],{"class":114,"line":435},[112,24589,1435],{"class":229},[112,24591,17897],{"class":129},[112,24593,354],{"class":229},[112,24595,539],{"class":229},[112,24597,23955],{"class":118},[112,24599,456],{"class":236},[112,24601,23421],{"class":129},[112,24603,375],{"class":229},[112,24605,24606],{"class":236},", page.id);\n",[112,24608,24609,24611,24613,24615,24617,24619],{"class":114,"line":440},[112,24610,1435],{"class":229},[112,24612,1452],{"class":129},[112,24614,354],{"class":229},[112,24616,539],{"class":229},[112,24618,24291],{"class":118},[112,24620,18233],{"class":236},[112,24622,24623,24625,24627,24630,24633],{"class":114,"line":4949},[112,24624,24488],{"class":236},[112,24626,14547],{"class":118},[112,24628,24629],{"class":236},"({ id: page.id, source: ",[112,24631,24632],{"class":122},"\"notion\"",[112,24634,24635],{"class":236},", content, embedding });\n",[112,24637,24638],{"class":114,"line":4960},[112,24639,1476],{"class":236},[112,24641,24642],{"class":114,"line":4972},[112,24643,584],{"class":236},[67,24645,24647],{"id":24646},"step-8-finding-answers",[478,24648,24649],{},"Step 8: Finding Answers",[19,24651,24652],{},"Now that we have the data ready, it is time to implement the Bot or enterprise search that will use this data to answer questions from a user.",[19,24654,24655],{},"The basic flow would be:",[43,24657,24658,24661,24664,24671],{},[46,24659,24660],{},"Embed the question asked",[46,24662,24663],{},"Find similar docs in the Vector DB",[46,24665,24666,24667,24670],{},"Send the top ",[109,24668,24669],{},"n"," amount of docs as context paired with the question to Unified's GenAI endpoint.",[46,24672,24673],{},"Return the answer to the user.",[19,24675,24676],{},"For the purpose of the example, we will be sending the top 3 most similar docs.",[102,24678,24680],{"className":220,"code":24679,"language":222,"meta":107,"style":107},"function cosineSimilarity(a: number[], b: number[]) {\n  const dot = a.reduce((sum, ai, i) => sum + ai * b[i], 0);\n  const normA = Math.sqrt(a.reduce((sum, ai) => sum + ai * ai, 0));\n  const normB = Math.sqrt(b.reduce((sum, bi) => sum + bi * bi, 0));\n  return dot / (normA * normB);\n}\n\nasync function answerQuestion(question: string) {\n  const questionEmbedding = await embedText(question);\n\n  // For the purpose of the example we will be sending the top 3 docs\n  const scored = vectorDB.map(doc => ({\n    ...doc,\n    score: cosineSimilarity(questionEmbedding, doc.embedding!)\n  }));\n  const topDocs = scored.sort((a, b) => b.score - a.score).slice(0, 3);\n\n  const context = topDocs.map(doc => doc.content).join('\\n---\\n');\n \n  const prompt = `\nYou are a helpful company knowledge bot. Use the following context to answer the question.\n\nContext:\n${context}Question:\n${question}Answer in a concise and accurate way.\n  `;\n\n  const result = await sdk.genai.createGenaiPrompt({\n    connectionId: CONNECTION_GENAI!,\n    prompt: {\n      messages: [{ role: \"USER\", content: prompt }],\n      maxTokens: 256,\n      temperature: 0.2\n    }\n  });\n\n  return result.choices?.[0]?.message?.content || \"No answer generated.\";\n}\n",[109,24681,24682,24709,24761,24809,24856,24873,24877,24881,24900,24916,24920,24925,24949,24957,24972,24977,25026,25030,25071,25075,25086,25091,25095,25100,25110,25119,25126,25130,25146,25156,25160,25168,25177,25184,25188,25192,25196,25213],{"__ignoreMap":107},[112,24683,24684,24686,24689,24691,24693,24695,24697,24700,24703,24705,24707],{"class":114,"line":115},[112,24685,9978],{"class":229},[112,24687,24688],{"class":118}," cosineSimilarity",[112,24690,456],{"class":236},[112,24692,1614],{"class":517},[112,24694,171],{"class":229},[112,24696,1054],{"class":129},[112,24698,24699],{"class":236},"[], ",[112,24701,24702],{"class":517},"b",[112,24704,171],{"class":229},[112,24706,1054],{"class":129},[112,24708,1057],{"class":236},[112,24710,24711,24713,24716,24718,24721,24724,24726,24729,24731,24734,24736,24739,24741,24743,24746,24748,24751,24754,24757,24759],{"class":114,"line":126},[112,24712,531],{"class":229},[112,24714,24715],{"class":129}," dot",[112,24717,354],{"class":229},[112,24719,24720],{"class":236}," a.",[112,24722,24723],{"class":118},"reduce",[112,24725,735],{"class":236},[112,24727,24728],{"class":517},"sum",[112,24730,1046],{"class":236},[112,24732,24733],{"class":517},"ai",[112,24735,1046],{"class":236},[112,24737,24738],{"class":517},"i",[112,24740,745],{"class":236},[112,24742,748],{"class":229},[112,24744,24745],{"class":236}," sum ",[112,24747,19069],{"class":229},[112,24749,24750],{"class":236}," ai ",[112,24752,24753],{"class":229},"*",[112,24755,24756],{"class":236}," b[i], ",[112,24758,660],{"class":129},[112,24760,464],{"class":236},[112,24762,24763,24765,24768,24770,24773,24776,24779,24781,24783,24785,24787,24789,24791,24793,24795,24797,24799,24801,24804,24806],{"class":114,"line":135},[112,24764,531],{"class":229},[112,24766,24767],{"class":129}," normA",[112,24769,354],{"class":229},[112,24771,24772],{"class":236}," Math.",[112,24774,24775],{"class":118},"sqrt",[112,24777,24778],{"class":236},"(a.",[112,24780,24723],{"class":118},[112,24782,735],{"class":236},[112,24784,24728],{"class":517},[112,24786,1046],{"class":236},[112,24788,24733],{"class":517},[112,24790,745],{"class":236},[112,24792,748],{"class":229},[112,24794,24745],{"class":236},[112,24796,19069],{"class":229},[112,24798,24750],{"class":236},[112,24800,24753],{"class":229},[112,24802,24803],{"class":236}," ai, ",[112,24805,660],{"class":129},[112,24807,24808],{"class":236},"));\n",[112,24810,24811,24813,24816,24818,24820,24822,24825,24827,24829,24831,24833,24836,24838,24840,24842,24844,24847,24849,24852,24854],{"class":114,"line":147},[112,24812,531],{"class":229},[112,24814,24815],{"class":129}," normB",[112,24817,354],{"class":229},[112,24819,24772],{"class":236},[112,24821,24775],{"class":118},[112,24823,24824],{"class":236},"(b.",[112,24826,24723],{"class":118},[112,24828,735],{"class":236},[112,24830,24728],{"class":517},[112,24832,1046],{"class":236},[112,24834,24835],{"class":517},"bi",[112,24837,745],{"class":236},[112,24839,748],{"class":229},[112,24841,24745],{"class":236},[112,24843,19069],{"class":229},[112,24845,24846],{"class":236}," bi ",[112,24848,24753],{"class":229},[112,24850,24851],{"class":236}," bi, ",[112,24853,660],{"class":129},[112,24855,24808],{"class":236},[112,24857,24858,24860,24863,24865,24868,24870],{"class":114,"line":202},[112,24859,621],{"class":229},[112,24861,24862],{"class":236}," dot ",[112,24864,12874],{"class":229},[112,24866,24867],{"class":236}," (normA ",[112,24869,24753],{"class":229},[112,24871,24872],{"class":236}," normB);\n",[112,24874,24875],{"class":114,"line":208},[112,24876,584],{"class":236},[112,24878,24879],{"class":114,"line":291},[112,24880,272],{"emptyLinePlaceholder":271},[112,24882,24883,24885,24887,24890,24892,24894,24896,24898],{"class":114,"line":299},[112,24884,1377],{"class":229},[112,24886,509],{"class":229},[112,24888,24889],{"class":118}," answerQuestion",[112,24891,456],{"class":236},[112,24893,20012],{"class":517},[112,24895,171],{"class":229},[112,24897,523],{"class":129},[112,24899,526],{"class":236},[112,24901,24902,24904,24907,24909,24911,24913],{"class":114,"line":307},[112,24903,531],{"class":229},[112,24905,24906],{"class":129}," questionEmbedding",[112,24908,354],{"class":229},[112,24910,539],{"class":229},[112,24912,24291],{"class":118},[112,24914,24915],{"class":236},"(question);\n",[112,24917,24918],{"class":114,"line":315},[112,24919,272],{"emptyLinePlaceholder":271},[112,24921,24922],{"class":114,"line":323},[112,24923,24924],{"class":578},"  // For the purpose of the example we will be sending the top 3 docs\n",[112,24926,24927,24929,24932,24934,24937,24939,24941,24944,24946],{"class":114,"line":329},[112,24928,531],{"class":229},[112,24930,24931],{"class":129}," scored",[112,24933,354],{"class":229},[112,24935,24936],{"class":236}," vectorDB.",[112,24938,732],{"class":118},[112,24940,456],{"class":236},[112,24942,24943],{"class":517},"doc",[112,24945,18200],{"class":229},[112,24947,24948],{"class":236}," ({\n",[112,24950,24951,24954],{"class":114,"line":341},[112,24952,24953],{"class":229},"    ...",[112,24955,24956],{"class":236},"doc,\n",[112,24958,24959,24962,24965,24968,24970],{"class":114,"line":346},[112,24960,24961],{"class":236},"    score: ",[112,24963,24964],{"class":118},"cosineSimilarity",[112,24966,24967],{"class":236},"(questionEmbedding, doc.embedding",[112,24969,375],{"class":229},[112,24971,15267],{"class":236},[112,24973,24974],{"class":114,"line":366},[112,24975,24976],{"class":236},"  }));\n",[112,24978,24979,24981,24984,24986,24989,24992,24994,24996,24998,25000,25002,25004,25007,25009,25012,25015,25017,25019,25021,25024],{"class":114,"line":381},[112,24980,531],{"class":229},[112,24982,24983],{"class":129}," topDocs",[112,24985,354],{"class":229},[112,24987,24988],{"class":236}," scored.",[112,24990,24991],{"class":118},"sort",[112,24993,735],{"class":236},[112,24995,1614],{"class":517},[112,24997,1046],{"class":236},[112,24999,24702],{"class":517},[112,25001,745],{"class":236},[112,25003,748],{"class":229},[112,25005,25006],{"class":236}," b.score ",[112,25008,23301],{"class":229},[112,25010,25011],{"class":236}," a.score).",[112,25013,25014],{"class":118},"slice",[112,25016,456],{"class":236},[112,25018,660],{"class":129},[112,25020,1046],{"class":236},[112,25022,25023],{"class":129},"3",[112,25025,464],{"class":236},[112,25027,25028],{"class":114,"line":387},[112,25029,272],{"emptyLinePlaceholder":271},[112,25031,25032,25034,25037,25039,25042,25044,25046,25048,25050,25053,25055,25057,25060,25062,25065,25067,25069],{"class":114,"line":392},[112,25033,531],{"class":229},[112,25035,25036],{"class":129}," context",[112,25038,354],{"class":229},[112,25040,25041],{"class":236}," topDocs.",[112,25043,732],{"class":118},[112,25045,456],{"class":236},[112,25047,24943],{"class":517},[112,25049,18200],{"class":229},[112,25051,25052],{"class":236}," doc.content).",[112,25054,775],{"class":118},[112,25056,456],{"class":236},[112,25058,25059],{"class":122},"'",[112,25061,19472],{"class":129},[112,25063,25064],{"class":122},"---",[112,25066,19472],{"class":129},[112,25068,25059],{"class":122},[112,25070,464],{"class":236},[112,25072,25073],{"class":114,"line":409},[112,25074,21812],{"class":236},[112,25076,25077,25079,25081,25083],{"class":114,"line":422},[112,25078,531],{"class":229},[112,25080,21918],{"class":129},[112,25082,354],{"class":229},[112,25084,25085],{"class":122}," `\n",[112,25087,25088],{"class":114,"line":435},[112,25089,25090],{"class":122},"You are a helpful company knowledge bot. Use the following context to answer the question.\n",[112,25092,25093],{"class":114,"line":440},[112,25094,272],{"emptyLinePlaceholder":271},[112,25096,25097],{"class":114,"line":4949},[112,25098,25099],{"class":122},"Context:\n",[112,25101,25102,25104,25107],{"class":114,"line":4960},[112,25103,19475],{"class":122},[112,25105,25106],{"class":236},"context",[112,25108,25109],{"class":122},"}Question:\n",[112,25111,25112,25114,25116],{"class":114,"line":4972},[112,25113,19475],{"class":122},[112,25115,20012],{"class":236},[112,25117,25118],{"class":122},"}Answer in a concise and accurate way.\n",[112,25120,25121,25124],{"class":114,"line":4984},[112,25122,25123],{"class":122},"  `",[112,25125,237],{"class":236},[112,25127,25128],{"class":114,"line":4992},[112,25129,272],{"emptyLinePlaceholder":271},[112,25131,25132,25134,25136,25138,25140,25142,25144],{"class":114,"line":5000},[112,25133,531],{"class":229},[112,25135,911],{"class":129},[112,25137,354],{"class":229},[112,25139,539],{"class":229},[112,25141,918],{"class":236},[112,25143,1191],{"class":118},[112,25145,363],{"class":236},[112,25147,25148,25150,25152,25154],{"class":114,"line":5008},[112,25149,928],{"class":236},[112,25151,931],{"class":129},[112,25153,375],{"class":229},[112,25155,288],{"class":236},[112,25157,25158],{"class":114,"line":5016},[112,25159,1208],{"class":236},[112,25161,25162,25164,25166],{"class":114,"line":5024},[112,25163,1213],{"class":236},[112,25165,1216],{"class":122},[112,25167,21975],{"class":236},[112,25169,25170,25172,25175],{"class":114,"line":5032},[112,25171,970],{"class":236},[112,25173,25174],{"class":129},"256",[112,25176,288],{"class":236},[112,25178,25179,25181],{"class":114,"line":5040},[112,25180,1247],{"class":236},[112,25182,25183],{"class":129},"0.2\n",[112,25185,25186],{"class":114,"line":5046},[112,25187,3946],{"class":236},[112,25189,25190],{"class":114,"line":5052},[112,25191,567],{"class":236},[112,25193,25194],{"class":114,"line":5061},[112,25195,272],{"emptyLinePlaceholder":271},[112,25197,25198,25200,25202,25204,25206,25208,25211],{"class":114,"line":5066},[112,25199,621],{"class":229},[112,25201,1282],{"class":236},[112,25203,660],{"class":129},[112,25205,22030],{"class":236},[112,25207,1109],{"class":229},[112,25209,25210],{"class":122}," \"No answer generated.\"",[112,25212,237],{"class":236},[112,25214,25215],{"class":114,"line":9217},[112,25216,584],{"class":236},[67,25218,25220],{"id":25219},"step-9-usage",[478,25221,25222],{},"Step 9: Usage",[102,25224,25226],{"className":220,"code":25225,"language":222,"meta":107,"style":107},"(async () => {\n  await indexAllContent();\n  const answer = await answerQuestion(\"How do I request vacation days?\");\n  console.log(\"Bot answer:\", answer);\n})();\n",[109,25227,25228,25241,25249,25269,25283],{"__ignoreMap":107},[112,25229,25230,25232,25234,25237,25239],{"class":114,"line":115},[112,25231,456],{"class":236},[112,25233,1377],{"class":229},[112,25235,25236],{"class":236}," () ",[112,25238,748],{"class":229},[112,25240,280],{"class":236},[112,25242,25243,25245,25247],{"class":114,"line":126},[112,25244,1062],{"class":229},[112,25246,24404],{"class":118},[112,25248,1536],{"class":236},[112,25250,25251,25253,25256,25258,25260,25262,25264,25267],{"class":114,"line":135},[112,25252,531],{"class":229},[112,25254,25255],{"class":129}," answer",[112,25257,354],{"class":229},[112,25259,539],{"class":229},[112,25261,24889],{"class":118},[112,25263,456],{"class":236},[112,25265,25266],{"class":122},"\"How do I request vacation days?\"",[112,25268,464],{"class":236},[112,25270,25271,25273,25275,25277,25280],{"class":114,"line":147},[112,25272,1509],{"class":236},[112,25274,1512],{"class":118},[112,25276,456],{"class":236},[112,25278,25279],{"class":122},"\"Bot answer:\"",[112,25281,25282],{"class":236},", answer);\n",[112,25284,25285],{"class":114,"line":202},[112,25286,25287],{"class":236},"})();\n",[19,25289,25290],{},"At Unified, most of our customers are using this simple RAG Pipeline flow to add AI-powered intelligence to their application.  It can be used across industries and verticals as Unified supports 21 B2B SaaS categories and more than 350 integrations to retrieve end-customer data from.",[1558,25292,25293],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":107,"searchDepth":126,"depth":126,"links":25295},[25296,25297,25298,25299,25300,25301,25302,25305,25306,25307],{"id":69,"depth":126,"text":70},{"id":23285,"depth":126,"text":23288},{"id":20611,"depth":126,"text":20612},{"id":23466,"depth":126,"text":23469},{"id":23754,"depth":126,"text":23757},{"id":24054,"depth":126,"text":24057},{"id":24131,"depth":126,"text":24134,"children":25303},[25304],{"id":24145,"depth":135,"text":24146},{"id":24372,"depth":126,"text":24375},{"id":24646,"depth":126,"text":24649},{"id":25219,"depth":126,"text":25222},"In this article, we will be going into detail on how to build an enterprise search application as well as a Q&A bot using a RAG pipeline with Unified's data...",{"img":25310,"date":25311,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_enterprise_search_using_rag-icon.png","2025-11-19T00:00:00.000Z","/guides/how_to_build_enterprise_search_using_rag",{"title":23215,"description":25308},"guides/how_to_build_enterprise_search_using_rag","YuBTiLio-FE-NY-dea1rj2nRW3P_nnKGRWPo9bJ-DtU",{"id":25317,"title":25318,"body":25319,"description":25986,"extension":1576,"meta":25987,"navigation":271,"path":25990,"seo":25991,"stem":25992,"__hash__":25993},"guides/guides/how_to_configure_webhooks_in_hubspot.md","How to configure webhooks in HubSpot",{"type":9,"value":25320,"toc":25971},[25321,25324,25326,25331,25334,25336,25371,25375,25379,25385,25389,25392,25457,25461,25464,25552,25556,25563,25636,25640,25644,25654,25712,25718,25721,25890,25897,25907,25917,25921,25924,25933,25936,25942,25946,25968],[12,25322,25318],{"id":25323},"how-to-configure-webhooks-in-hubspot",[16,25325],{},[19,25327,25328],{},[22,25329,25330],{},"February 23, 2024",[19,25332,25333],{},"This guide walks you through how to configure webhooks in HubSpot to work with Unified.to. These webhooks allow you to get notifications about new events and changes from HubSpot e.g. new leads, updated deals, or deleted contacts.",[67,25335,13634],{"id":13633},[72,25337,25338,25341,25344,25362],{},[46,25339,25340],{},"Make sure you have a HubSpot developer account.",[46,25342,25343],{},"Get your client ID, client secret, and developer API key.",[46,25345,25346,25347,25350,25351,25354],{},"Point the ",[478,25348,25349],{},"Redirect URL"," in your HubSpot app to ",[109,25352,25353],{},"api.unified.to/oauth/code",[72,25355,25356],{},[46,25357,25358,25359],{},"If you're using the EU data region, use instead",[109,25360,25361],{},"api-eu.unified.to/oauth/code",[46,25363,25364,25365,25370],{},"Follow our ",[1614,25366,25369],{"href":25367,"rel":25368},"https://docs.unified.to/guides/how_to_register_a_hubspot_developer_app_and_get_your_oauth_2_credentials#how-to-register-a-hubspot-developer-app-and-get-your-oauth-2-credentials",[1618],"HubSpot developer guide"," to see how to do all of the above.",[67,25372,25374],{"id":25373},"setting-up-webhooks-in-hubspot-legacy-apps","Setting up Webhooks in Hubspot Legacy Apps",[35,25376,25378],{"id":25377},"select-the-appropriate-legacy-app-to-setup-the-webhook","Select the appropriate Legacy App to setup the webhook",[19,25380,25381],{},[1603,25382],{"alt":25383,"src":25384},"Screenshot_2025-11-25_at_12.21.18_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-0.png",[35,25386,25388],{"id":25387},"set-the-target-url-for-the-webhook","Set the target URL for the webhook",[19,25390,25391],{},"HubSpot uses a single webhook URL per app, which means you need to configure your app to send any events to the Unified.to servers.",[43,25393,25394,25402,25407,25410,25420,25450],{},[46,25395,25396,25397,634],{},"Navigate to your ",[1614,25398,25401],{"href":25399,"rel":25400},"https://app.hubspot.com/",[1618],"HubSpot developer account",[46,25403,9757,25404],{},[478,25405,25406],{},"Apps.",[46,25408,25409],{},"Select the app you wish to use to access your customers' data.",[46,25411,9757,25412,25415,25417],{},[478,25413,25414],{},"Webhooks.",[17180,25416],{},[1603,25418],{"alt":11593,"src":25419},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-1.png",[46,25421,25422,25423,171,25426,25440,25442,25443,25446,25447],{},"Under ",[478,25424,25425],{},"Target URL",[43,25427,25428,25434],{},[46,25429,25430,25431],{},"If you are using the US data region, copy and paste in: ",[109,25432,25433],{},"api.unified.to/webhook/workspace/hubspot",[46,25435,25436,25437],{},"If you using the EU data region, copy and paste in: ",[109,25438,25439],{},"api-eu.unified.to/webhook/workspace/hubspot",[17180,25441],{},"If your URL is greyed out and you have subscriptions under ",[478,25444,25445],{},"Event subscriptions",", then you'll need to unsubscribe from all of them. ",[22,25448,25449],{},"WARNING: If these subscriptions and the target URL are used by other applications, this action will break them. In that case, you may want to consider creating a new developer app to use with Unified.to.",[46,25451,25452,25453,25456],{},"You do ",[478,25454,25455],{},"not"," have to create any subscriptions manually. Unified.to will do that on your behalf.",[35,25458,25460],{"id":25459},"add-scopes-for-your-webhooks","Add scopes for your webhooks",[19,25462,25463],{},"In order for Unified.to to receive webhook data from HubSpot, you need to add scopes for the events you are interested in as well as a few others.",[43,25465,25466,25476,25540],{},[46,25467,25468,25469,25472,25473],{},"With your app page still open, click ",[478,25470,25471],{},"Basic Info"," and then click ",[478,25474,25475],{},"Auth.",[46,25477,25478,25479,171,25482],{},"Scroll down to ",[478,25480,25481],{},"Scopes",[43,25483,25484,25493,25514,25520,25533],{},[46,25485,25486,25487,25490,25491,634],{},"Add ",[109,25488,25489],{},"crm.objects.owners.read","as ",[478,25492,2431],{},[46,25494,25495,25496,25499],{},"For any events where you want to read data, add them as ",[478,25497,25498],{},"Required.",[43,25500,25501],{},[46,25502,25503,25504,11338,25507,25510,25511,25513],{},"Note: This applies to events that you'll be subscribed to as well as those that you will only call via the API. For example, if you want to create a Contacts webhook and also fetch Companies via the API, you'll need to add both ",[109,25505,25506],{},"crm.objects.contacts.read",[109,25508,25509],{},"crm.objects.companies.read"," as ",[478,25512,2431],{}," because Unified.to will pass all of these as required scopes in each auth flow.",[46,25515,25516,25517,634],{},"For any events where you want to write data, add them as ",[478,25518,25519],{},"Optional",[46,25521,25522,25523,25510,25525,25527,25528,25510,25531,634],{},"For example, if you want to receive notifications about updates to HubSpot companies, you'll need to add ",[109,25524,25509],{},[478,25526,2431],{},". If you want to write data to companies, add ",[109,25529,25530],{},"crm.objects.companies.write",[478,25532,25519],{},[46,25534,25535,25536,634],{},"To see the full list of HubSpot scopes that Unified.to supports, see: ",[1614,25537,25538],{"href":25538,"rel":25539},"https://app.unified.to/integrations/hubspot?tab=oauth2",[1618],[46,25541,2288,25542,25545,25546,25548],{},[109,25543,25544],{},"oauth"," scope is also required for all HubSpot integrations. This will be added by default if your app was created after April 2024.",[17180,25547],{},[1603,25549],{"alt":25550,"src":25551},"Screenshot_2024-08-26_at_2.35.36_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-2.png",[35,25553,25555],{"id":25554},"select-permission-scopes-on-unifiedto","Select permission scopes on Unified.to",[19,25557,25558,25559,25562],{},"When prompting your customers to authorize access to their third-party accounts, you will need to select the corresponding scopes in ",[1614,25560,1640],{"href":1638,"rel":25561},[1618]," as well. The following steps show you how to do that when using our Embedded Authorization component.",[43,25564,25565,25580,25586],{},[46,25566,25567,25568,25571,25572,25578],{},"On app.unified.to, click on ",[478,25569,25570],{},"Settings"," and then ",[1614,25573,25576],{"href":25574,"rel":25575},"https://app.unified.to/settings/embed?tab=Authorization",[1618],[478,25577,9933],{},[478,25579,634],{},[46,25581,25582,25583,634],{},"You will see a preview of the Embedded Authorization component on the left and a list of configuration options on the right. Click on ",[478,25584,25585],{},"Options",[46,25587,25478,25588,25591,25592,25594,25595,9571,25597,25599,25600,25603,25604],{},[478,25589,25590],{},"Permission scopes"," and select ",[478,25593,18788],{}," as well as any other permission scopes that you need e.g. the same scopes you added in HubSpot. You do not need to select ",[109,25596,25544],{},[109,25598,25489],{}," on ",[1614,25601,1640],{"href":1638,"rel":25602},[1618]," as well will map these automatically on our end.\n",[43,25605,25606,25620,25626],{},[46,25607,25608,25609,11338,25611,25614,25616],{},"For example, using the examples from above for reading Contacts and Companies, the scopes in Unified.to would be  ",[109,25610,9866],{},[109,25612,25613],{},"crm_company_read",[17180,25615],{},[1603,25617],{"alt":25618,"src":25619},"c9a0cf8d-eca3-4b74-8d52-d84a2fb6029f.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-3.png",[46,25621,25622,25623,634],{},"A mapping of Unified scopes to their HubSpot counterparts can be found ",[1614,25624,17258],{"href":25538,"rel":25625},[1618],[46,25627,25628,25629,25632,25633,25635],{},"Tip: Under ",[478,25630,25631],{},"Integration categories,"," select ",[478,25634,13099],{}," to only see scopes related to CRM data objects.",[67,25637,25639],{"id":25638},"setting-up-webhooks-in-hubspot-development-platform","Setting up Webhooks in Hubspot Development Platform",[35,25641,25643],{"id":25642},"create-webhook-configuration-file","Create Webhook configuration file",[19,25645,25646,25647,25649,25650,25653],{},"In your hubspot project folder, create a new folder ",[109,25648,18788],{}," and inside add in the ",[109,25651,25652],{},"webhook-hsmeta.json"," file.",[102,25655,25657],{"className":9951,"code":25656,"language":9953,"meta":107,"style":107},"project-folder/\n└── src/\n    └── app/\n        ├── app-hsmeta.json\n        └── webhooks/\n            └── webhook-hsmeta.json\n",[109,25658,25659,25672,25679,25686,25696,25703],{"__ignoreMap":107},[112,25660,25661,25664,25666,25669],{"class":114,"line":115},[112,25662,25663],{"class":236},"project",[112,25665,23301],{"class":229},[112,25667,25668],{"class":236},"folder",[112,25670,25671],{"class":229},"/\n",[112,25673,25674,25677],{"class":114,"line":126},[112,25675,25676],{"class":236},"└── src",[112,25678,25671],{"class":229},[112,25680,25681,25684],{"class":114,"line":135},[112,25682,25683],{"class":236},"    └── app",[112,25685,25671],{"class":229},[112,25687,25688,25691,25693],{"class":114,"line":147},[112,25689,25690],{"class":236},"        ├── app",[112,25692,23301],{"class":229},[112,25694,25695],{"class":236},"hsmeta.json\n",[112,25697,25698,25701],{"class":114,"line":202},[112,25699,25700],{"class":236},"        └── webhooks",[112,25702,25671],{"class":229},[112,25704,25705,25708,25710],{"class":114,"line":208},[112,25706,25707],{"class":236},"            └── webhook",[112,25709,23301],{"class":229},[112,25711,25695],{"class":236},[35,25713,25715],{"id":25714},"setup-webhook-configuration",[478,25716,25717],{},"Setup Webhook configuration",[19,25719,25720],{},"Now that you have the webhook config file ready, let's setup the configuration as follows:",[102,25722,25724],{"className":9951,"code":25723,"language":9953,"meta":107,"style":107},"{\n  \"uid\": \"webhooks\",\n  \"type\": \"webhooks\",\n  \"config\": {\n    \"settings\": {\n      \"targetUrl\": \"https://api.unified.to/webhook/workspace/hubspot\",\n      \"maxConcurrentRequests\": 10\n    },\n    \"subscriptions\": {\n      \"legacyCrmObjects\": [\n        {\n          \"subscriptionType\": \"deals.propertyChange\",\n          \"propertyName\": \"dealstage\",\n          \"active\": true\n        },\n        {\n          \"subscriptionType\": \"deals.associationChange\",\n          \"active\": true\n        }\n      ]\n    }\n  }\n}\n",[109,25725,25726,25730,25742,25752,25759,25766,25778,25788,25792,25799,25806,25810,25822,25834,25843,25847,25851,25862,25870,25874,25878,25882,25886],{"__ignoreMap":107},[112,25727,25728],{"class":114,"line":115},[112,25729,2327],{"class":236},[112,25731,25732,25735,25737,25740],{"class":114,"line":126},[112,25733,25734],{"class":122},"  \"uid\"",[112,25736,2335],{"class":236},[112,25738,25739],{"class":122},"\"webhooks\"",[112,25741,288],{"class":236},[112,25743,25744,25746,25748,25750],{"class":114,"line":135},[112,25745,8956],{"class":122},[112,25747,2335],{"class":236},[112,25749,25739],{"class":122},[112,25751,288],{"class":236},[112,25753,25754,25757],{"class":114,"line":147},[112,25755,25756],{"class":122},"  \"config\"",[112,25758,3888],{"class":236},[112,25760,25761,25764],{"class":114,"line":202},[112,25762,25763],{"class":122},"    \"settings\"",[112,25765,3888],{"class":236},[112,25767,25768,25771,25773,25776],{"class":114,"line":208},[112,25769,25770],{"class":122},"      \"targetUrl\"",[112,25772,2335],{"class":236},[112,25774,25775],{"class":122},"\"https://api.unified.to/webhook/workspace/hubspot\"",[112,25777,288],{"class":236},[112,25779,25780,25783,25785],{"class":114,"line":291},[112,25781,25782],{"class":122},"      \"maxConcurrentRequests\"",[112,25784,2335],{"class":236},[112,25786,25787],{"class":129},"10\n",[112,25789,25790],{"class":114,"line":299},[112,25791,988],{"class":236},[112,25793,25794,25797],{"class":114,"line":307},[112,25795,25796],{"class":122},"    \"subscriptions\"",[112,25798,3888],{"class":236},[112,25800,25801,25804],{"class":114,"line":315},[112,25802,25803],{"class":122},"      \"legacyCrmObjects\"",[112,25805,2372],{"class":236},[112,25807,25808],{"class":114,"line":323},[112,25809,4001],{"class":236},[112,25811,25812,25815,25817,25820],{"class":114,"line":329},[112,25813,25814],{"class":122},"          \"subscriptionType\"",[112,25816,2335],{"class":236},[112,25818,25819],{"class":122},"\"deals.propertyChange\"",[112,25821,288],{"class":236},[112,25823,25824,25827,25829,25832],{"class":114,"line":341},[112,25825,25826],{"class":122},"          \"propertyName\"",[112,25828,2335],{"class":236},[112,25830,25831],{"class":122},"\"dealstage\"",[112,25833,288],{"class":236},[112,25835,25836,25839,25841],{"class":114,"line":346},[112,25837,25838],{"class":122},"          \"active\"",[112,25840,2335],{"class":236},[112,25842,4144],{"class":129},[112,25844,25845],{"class":114,"line":366},[112,25846,4803],{"class":236},[112,25848,25849],{"class":114,"line":381},[112,25850,4001],{"class":236},[112,25852,25853,25855,25857,25860],{"class":114,"line":387},[112,25854,25814],{"class":122},[112,25856,2335],{"class":236},[112,25858,25859],{"class":122},"\"deals.associationChange\"",[112,25861,288],{"class":236},[112,25863,25864,25866,25868],{"class":114,"line":392},[112,25865,25838],{"class":122},[112,25867,2335],{"class":236},[112,25869,4144],{"class":129},[112,25871,25872],{"class":114,"line":409},[112,25873,4052],{"class":236},[112,25875,25876],{"class":114,"line":422},[112,25877,3941],{"class":236},[112,25879,25880],{"class":114,"line":435},[112,25881,3946],{"class":236},[112,25883,25884],{"class":114,"line":440},[112,25885,1476],{"class":236},[112,25887,25888],{"class":114,"line":4949},[112,25889,584],{"class":236},[19,25891,25892,25893,25896],{},"For the ",[109,25894,25895],{},"targetUrl"," :",[43,25898,25899,25903],{},[46,25900,25430,25901],{},[109,25902,25433],{},[46,25904,25436,25905],{},[109,25906,25439],{},[19,25908,25892,25909,25912,25913,25916],{},[109,25910,25911],{},"subscriptions"," we need to use the ",[109,25914,25915],{},"legacyCrmObjects"," to define which object we want to get events for.",[35,25918,25920],{"id":25919},"deploy-hubspot-project","Deploy Hubspot Project",[19,25922,25923],{},"Once you've setup your webhook configuration, you can now upload the project via:",[102,25925,25927],{"className":9951,"code":25926,"language":9953,"meta":107,"style":107},"hs project upload\n",[109,25928,25929],{"__ignoreMap":107},[112,25930,25931],{"class":114,"line":115},[112,25932,25926],{"class":236},[19,25934,25935],{},"Once uploaded, your configuration should now show up in your app's webhook list:",[19,25937,25938],{},[1603,25939],{"alt":25940,"src":25941},"Screenshot_2025-11-25_at_12.34.02_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-4.png",[67,25943,25945],{"id":25944},"see-also","See also",[72,25947,25948,25955,25961],{},[46,25949,25950],{},[1614,25951,25954],{"href":25952,"rel":25953},"https://docs.unified.to/concepts/webhooks#introduction-to-webhooks",[1618],"Introduction to webhooks",[46,25956,25957],{},[1614,25958,25960],{"href":14661,"rel":25959},[1618],"Create a webhook subscription",[46,25962,25963],{},[1614,25964,25967],{"href":25965,"rel":25966},"https://docs.unified.to/guides/how_to_set_up_your_scopes_in_hubspot",[1618],"How to set up your scopes in HubSpot",[1558,25969,25970],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}",{"title":107,"searchDepth":126,"depth":126,"links":25972},[25973,25974,25980,25985],{"id":13633,"depth":126,"text":13634},{"id":25373,"depth":126,"text":25374,"children":25975},[25976,25977,25978,25979],{"id":25377,"depth":135,"text":25378},{"id":25387,"depth":135,"text":25388},{"id":25459,"depth":135,"text":25460},{"id":25554,"depth":135,"text":25555},{"id":25638,"depth":126,"text":25639,"children":25981},[25982,25983,25984],{"id":25642,"depth":135,"text":25643},{"id":25714,"depth":135,"text":25717},{"id":25919,"depth":135,"text":25920},{"id":25944,"depth":126,"text":25945},"This guide walks you through how to configure webhooks in HubSpot to work with Unified.to. These webhooks allow you to get notifications about new events and...",{"img":25988,"date":25989,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-icon.png","2024-02-23T00:00:00.000Z","/guides/how_to_configure_webhooks_in_hubspot",{"title":25318,"description":25986},"guides/how_to_configure_webhooks_in_hubspot","ir-zaSa_LtmV9kxZrxLuORVrml8PB9YyqIB8UZcv6b8",{"id":25995,"title":25996,"body":25997,"description":26988,"extension":1576,"meta":26989,"navigation":271,"path":26992,"seo":26993,"stem":26994,"__hash__":26995},"guides/guides/how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect Anthropic to Real-Time SaaS Data with Unified.to MCP Server",{"type":9,"value":25998,"toc":26980},[25999,26002,26004,26009,26012,26015,26018,26022,26033,26036,26062,26066,26071,26284,26288,26291,26323,26326,26330,26913,26917,26920,26952,26959,26970,26977],[12,26000,25996],{"id":26001},"how-to-connect-anthropic-to-real-time-saas-data-with-unifiedto-mcp-server",[16,26003],{},[19,26005,26006],{},[22,26007,26008],{},"August 28, 2025",[19,26010,26011],{},"Anthropic's Claude models can power sophisticated workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That usually means writing brittle glue code, normalizing APIs, and maintaining webhook jobs.",[19,26013,26014],{},"With Unified.to's MCP server, you can skip that complexity. Unified.to exposes 317+ SaaS integrations as real-time, callable tools that Claude can use directly — no custom integration logic required.",[19,26016,26017],{},"In this guide, we'll walk through how to connect Anthropic to Unified.to MCP so your application can give Claude real-time access to customer SaaS data and actions.",[67,26019,26021],{"id":26020},"authentication","Authentication",[19,26023,26024,26025,26028,26029,26032],{},"Every request to the Unified.to MCP server must include a token. You can pass this either as a URL parameter (",[109,26026,26027],{},"?token=...",") or in the ",[109,26030,26031],{},"Authorization: bearer {token}"," header.",[19,26034,26035],{},"There are two authentication flows:",[72,26037,26038,26050],{},[46,26039,26040,26043,26045,26046,26049],{},[478,26041,26042],{},"Private (workspace key + connection)",[17180,26044],{},"Use your Unified.to workspace API key and add a ",[109,26047,26048],{},"connection"," parameter. This should never be exposed publicly.",[46,26051,26052,26055,26057,26058,26061],{},[478,26053,26054],{},"Public (end-user safe)",[17180,26056],{},"Generate a token in the format ",[109,26059,26060],{},"{connectionID}-{nonce}-{signature}"," using your workspace secret. Safe to share with customers.",[67,26063,26065],{"id":26064},"integrating-with-anthropic-api","Integrating with Anthropic API",[19,26067,26068],{},[478,26069,26070],{},"Manual Tool Orchestration:",[43,26072,26073,26135,26218,26224],{},[46,26074,26075,26076,26079,26080],{},"Call Unified's ",[109,26077,26078],{},"/tools"," endpoint and pass the tool list to Claude:",[102,26081,26085],{"className":26082,"code":26083,"language":26084,"meta":107,"style":107},"language-python shiki shiki-themes github-dark github-dark github-light","resp = client.messages.create(\n    model=\"claude-3-5-sonnet-20241022\",\n    tools=tools,\n    input=\"list the candidates and then analyse the resumes from their applications\",\n)\n","python",[109,26086,26087,26097,26109,26119,26131],{"__ignoreMap":107},[112,26088,26089,26092,26094],{"class":114,"line":115},[112,26090,26091],{"class":236},"resp ",[112,26093,335],{"class":229},[112,26095,26096],{"class":236}," client.messages.create(\n",[112,26098,26099,26102,26104,26107],{"class":114,"line":126},[112,26100,26101],{"class":517},"    model",[112,26103,335],{"class":229},[112,26105,26106],{"class":122},"\"claude-3-5-sonnet-20241022\"",[112,26108,288],{"class":236},[112,26110,26111,26114,26116],{"class":114,"line":135},[112,26112,26113],{"class":517},"    tools",[112,26115,335],{"class":229},[112,26117,26118],{"class":236},"tools,\n",[112,26120,26121,26124,26126,26129],{"class":114,"line":147},[112,26122,26123],{"class":517},"    input",[112,26125,335],{"class":229},[112,26127,26128],{"class":122},"\"list the candidates and then analyse the resumes from their applications\"",[112,26130,288],{"class":236},[112,26132,26133],{"class":114,"line":202},[112,26134,15267],{"class":236},[46,26136,26137,26138,26141,26142],{},"Claude will return a ",[109,26139,26140],{},"tool_use"," block:",[102,26143,26145],{"className":2318,"code":26144,"language":2320,"meta":107,"style":107},"[\n  {\n    \"type\": \"tool_use\",\n    \"id\": \"toolu_...\",\n    \"name\": \"list_candidates\",\n    \"input\": { \"limit\": \"100\" }\n  }\n]\n",[109,26146,26147,26151,26156,26168,26180,26192,26210,26214],{"__ignoreMap":107},[112,26148,26149],{"class":114,"line":115},[112,26150,2728],{"class":236},[112,26152,26153],{"class":114,"line":126},[112,26154,26155],{"class":236},"  {\n",[112,26157,26158,26161,26163,26166],{"class":114,"line":135},[112,26159,26160],{"class":129},"    \"type\"",[112,26162,2335],{"class":236},[112,26164,26165],{"class":122},"\"tool_use\"",[112,26167,288],{"class":236},[112,26169,26170,26173,26175,26178],{"class":114,"line":147},[112,26171,26172],{"class":129},"    \"id\"",[112,26174,2335],{"class":236},[112,26176,26177],{"class":122},"\"toolu_...\"",[112,26179,288],{"class":236},[112,26181,26182,26185,26187,26190],{"class":114,"line":202},[112,26183,26184],{"class":129},"    \"name\"",[112,26186,2335],{"class":236},[112,26188,26189],{"class":122},"\"list_candidates\"",[112,26191,288],{"class":236},[112,26193,26194,26197,26200,26203,26205,26208],{"class":114,"line":208},[112,26195,26196],{"class":129},"    \"input\"",[112,26198,26199],{"class":236},": { ",[112,26201,26202],{"class":129},"\"limit\"",[112,26204,2335],{"class":236},[112,26206,26207],{"class":122},"\"100\"",[112,26209,2398],{"class":236},[112,26211,26212],{"class":114,"line":291},[112,26213,1476],{"class":236},[112,26215,26216],{"class":114,"line":299},[112,26217,2794],{"class":236},[46,26219,26075,26220,26223],{},[109,26221,26222],{},"/tools/{id}/call"," endpoint with the arguments.",[46,26225,26226,26227,26230,26231],{},"Return the result to Claude as a ",[109,26228,26229],{},"tool_result"," block in your next message:",[102,26232,26234],{"className":2318,"code":26233,"language":2320,"meta":107,"style":107},"[\n  {\n    \"type\": \"tool_result\",\n    \"tool_use_id\": \"toolu_...\",\n    \"content\": \"...\"\n  }\n]\n",[109,26235,26236,26240,26244,26255,26266,26276,26280],{"__ignoreMap":107},[112,26237,26238],{"class":114,"line":115},[112,26239,2728],{"class":236},[112,26241,26242],{"class":114,"line":126},[112,26243,26155],{"class":236},[112,26245,26246,26248,26250,26253],{"class":114,"line":135},[112,26247,26160],{"class":129},[112,26249,2335],{"class":236},[112,26251,26252],{"class":122},"\"tool_result\"",[112,26254,288],{"class":236},[112,26256,26257,26260,26262,26264],{"class":114,"line":147},[112,26258,26259],{"class":129},"    \"tool_use_id\"",[112,26261,2335],{"class":236},[112,26263,26177],{"class":122},[112,26265,288],{"class":236},[112,26267,26268,26271,26273],{"class":114,"line":202},[112,26269,26270],{"class":129},"    \"content\"",[112,26272,2335],{"class":236},[112,26274,26275],{"class":122},"\"...\"\n",[112,26277,26278],{"class":114,"line":208},[112,26279,1476],{"class":236},[112,26281,26282],{"class":114,"line":291},[112,26283,2794],{"class":236},[67,26285,26287],{"id":26286},"controlling-tool-access","Controlling Tool Access",[19,26289,26290],{},"Unified.to MCP gives you granular control over how tools are exposed to Anthropic:",[72,26292,26293,26299,26305,26311,26317],{},[46,26294,26295,26298],{},[109,26296,26297],{},"permissions"," → restrict available scopes.",[46,26300,26301,26304],{},[109,26302,26303],{},"tools"," → allowlist specific tool IDs.",[46,26306,26307,26310],{},[109,26308,26309],{},"aliases"," → add synonyms so Claude better matches tool names.",[46,26312,26313,26316],{},[109,26314,26315],{},"hide_sensitive=true"," → automatically strip PII (emails, phone numbers, etc).",[46,26318,26319,26322],{},[109,26320,26321],{},"include_external_tools=true"," → expose all vendor API endpoints, not just Unified.to's normalized models.",[19,26324,26325],{},"These options help you keep Anthropic outputs predictable and secure in production-grade workflows.",[35,26327,26329],{"id":26328},"sample-snippet","Sample Snippet",[102,26331,26333],{"className":9951,"code":26332,"language":9953,"meta":107,"style":107},"import Anthropic from '@anthropic-ai/sdk';\n// Claude model version\nconst modelVersion = 'latest';\n// Unified connection Id that you want to have the mcp to use tools for\nconst connection = 'UNIFIED_CONNECTION_ID';\n // location from where your unified account was created\nconst dc = 'us';\n// Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\n\nconst params = new URLSearchParams({\n    token: process.env.UNIFIED_API_KEY || '',\n    connection,\n    dc,\n    include_external_tools: includeExternal ? 'true' : 'false',\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst anthropic = new Anthropic({\n    apiKey: process.env.ANTHROPIC_API_KEY,\n});\n\nconst serverUrl = `${process.env.UNIFIED_MCP_URL}/sse?${params.toString()}`;\n\nlet latestModel;\n\nif (modelVersion === 'latest') {\n    // get the latest model from anthropic\n    const models = await anthropic.models.list();\n    latestModel = models.data[0].id;\n} else {\n    latestModel = modelVersion;\n}\n\nconst completion = await anthropic.beta.messages.create({\n    model: latestModel,\n    max_tokens: 1024,\n    messages: [\n        {\n            role: 'user',\n            content: message,\n        },\n    ],\n    stream: false,\n    mcp_servers: [\n        {\n            type: 'url',\n            url: `${process.env.UNIFIED_MCP_URL}/sse?${params.toString()}`, // change url as needed\n            name: 'unifiedMCP',\n        },\n    ],\n    betas: ['mcp-client-2025-04-04'],\n});\n\nconsole.log('response', JSON.stringify(completion, null, 2));\n",[109,26334,26335,26349,26354,26368,26373,26387,26392,26406,26411,26433,26437,26452,26466,26471,26476,26493,26497,26501,26518,26543,26547,26551,26567,26576,26580,26584,26625,26629,26637,26641,26654,26659,26678,26693,26701,26710,26714,26718,26736,26741,26750,26755,26759,26768,26773,26777,26781,26790,26795,26799,26809,26844,26854,26858,26862,26872,26876,26880],{"__ignoreMap":107},[112,26336,26337,26339,26342,26344,26347],{"class":114,"line":115},[112,26338,230],{"class":229},[112,26340,26341],{"class":236}," Anthropic ",[112,26343,247],{"class":229},[112,26345,26346],{"class":122}," '@anthropic-ai/sdk'",[112,26348,237],{"class":236},[112,26350,26351],{"class":114,"line":126},[112,26352,26353],{"class":578},"// Claude model version\n",[112,26355,26356,26358,26361,26363,26366],{"class":114,"line":135},[112,26357,277],{"class":229},[112,26359,26360],{"class":129}," modelVersion",[112,26362,354],{"class":229},[112,26364,26365],{"class":122}," 'latest'",[112,26367,237],{"class":236},[112,26369,26370],{"class":114,"line":147},[112,26371,26372],{"class":578},"// Unified connection Id that you want to have the mcp to use tools for\n",[112,26374,26375,26377,26380,26382,26385],{"class":114,"line":202},[112,26376,277],{"class":229},[112,26378,26379],{"class":129}," connection",[112,26381,354],{"class":229},[112,26383,26384],{"class":122}," 'UNIFIED_CONNECTION_ID'",[112,26386,237],{"class":236},[112,26388,26389],{"class":114,"line":208},[112,26390,26391],{"class":578}," // location from where your unified account was created\n",[112,26393,26394,26396,26399,26401,26404],{"class":114,"line":291},[112,26395,277],{"class":229},[112,26397,26398],{"class":129}," dc",[112,26400,354],{"class":229},[112,26402,26403],{"class":122}," 'us'",[112,26405,237],{"class":236},[112,26407,26408],{"class":114,"line":299},[112,26409,26410],{"class":578},"// Optional: list of specific tools that you want to use\n",[112,26412,26413,26415,26418,26420,26423,26426,26428,26431],{"class":114,"line":307},[112,26414,277],{"class":229},[112,26416,26417],{"class":129}," toolIds",[112,26419,354],{"class":229},[112,26421,26422],{"class":236}," [",[112,26424,26425],{"class":122},"'get_messaging_message'",[112,26427,4877],{"class":236},[112,26429,26430],{"class":122},"'list_messaging_message'",[112,26432,2794],{"class":236},[112,26434,26435],{"class":114,"line":315},[112,26436,272],{"emptyLinePlaceholder":271},[112,26438,26439,26441,26444,26446,26448,26450],{"class":114,"line":323},[112,26440,277],{"class":229},[112,26442,26443],{"class":129}," params",[112,26445,354],{"class":229},[112,26447,357],{"class":229},[112,26449,17299],{"class":118},[112,26451,363],{"class":236},[112,26453,26454,26457,26459,26461,26464],{"class":114,"line":329},[112,26455,26456],{"class":236},"    token: process.env.",[112,26458,372],{"class":129},[112,26460,669],{"class":229},[112,26462,26463],{"class":122}," ''",[112,26465,288],{"class":236},[112,26467,26468],{"class":114,"line":341},[112,26469,26470],{"class":236},"    connection,\n",[112,26472,26473],{"class":114,"line":346},[112,26474,26475],{"class":236},"    dc,\n",[112,26477,26478,26481,26483,26486,26488,26491],{"class":114,"line":366},[112,26479,26480],{"class":236},"    include_external_tools: includeExternal ",[112,26482,4711],{"class":229},[112,26484,26485],{"class":122}," 'true'",[112,26487,25896],{"class":229},[112,26489,26490],{"class":122}," 'false'",[112,26492,288],{"class":236},[112,26494,26495],{"class":114,"line":381},[112,26496,384],{"class":236},[112,26498,26499],{"class":114,"line":387},[112,26500,272],{"emptyLinePlaceholder":271},[112,26502,26503,26506,26509,26511,26514,26516],{"class":114,"line":392},[112,26504,26505],{"class":229},"if",[112,26507,26508],{"class":236}," (toolIds.",[112,26510,14591],{"class":129},[112,26512,26513],{"class":229}," >",[112,26515,14450],{"class":129},[112,26517,526],{"class":236},[112,26519,26520,26523,26526,26528,26531,26534,26536,26538,26541],{"class":114,"line":409},[112,26521,26522],{"class":236},"    params.",[112,26524,26525],{"class":118},"append",[112,26527,456],{"class":236},[112,26529,26530],{"class":122},"'tools'",[112,26532,26533],{"class":236},", toolIds.",[112,26535,775],{"class":118},[112,26537,456],{"class":236},[112,26539,26540],{"class":122},"','",[112,26542,24808],{"class":236},[112,26544,26545],{"class":114,"line":422},[112,26546,584],{"class":236},[112,26548,26549],{"class":114,"line":435},[112,26550,272],{"emptyLinePlaceholder":271},[112,26552,26553,26555,26558,26560,26562,26565],{"class":114,"line":440},[112,26554,277],{"class":229},[112,26556,26557],{"class":129}," anthropic",[112,26559,354],{"class":229},[112,26561,357],{"class":229},[112,26563,26564],{"class":118}," Anthropic",[112,26566,363],{"class":236},[112,26568,26569,26571,26574],{"class":114,"line":4949},[112,26570,19714],{"class":236},[112,26572,26573],{"class":129},"ANTHROPIC_API_KEY",[112,26575,288],{"class":236},[112,26577,26578],{"class":114,"line":4960},[112,26579,384],{"class":236},[112,26581,26582],{"class":114,"line":4972},[112,26583,272],{"emptyLinePlaceholder":271},[112,26585,26586,26588,26591,26593,26595,26598,26600,26603,26605,26608,26611,26614,26616,26618,26621,26623],{"class":114,"line":4984},[112,26587,277],{"class":229},[112,26589,26590],{"class":129}," serverUrl",[112,26592,354],{"class":229},[112,26594,751],{"class":122},[112,26596,26597],{"class":236},"process",[112,26599,634],{"class":122},[112,26601,26602],{"class":236},"env",[112,26604,634],{"class":122},[112,26606,26607],{"class":129},"UNIFIED_MCP_URL",[112,26609,26610],{"class":122},"}/sse?${",[112,26612,26613],{"class":236},"params",[112,26615,634],{"class":122},[112,26617,13776],{"class":118},[112,26619,26620],{"class":122},"()",[112,26622,640],{"class":122},[112,26624,237],{"class":236},[112,26626,26627],{"class":114,"line":4992},[112,26628,272],{"emptyLinePlaceholder":271},[112,26630,26631,26634],{"class":114,"line":5000},[112,26632,26633],{"class":229},"let",[112,26635,26636],{"class":236}," latestModel;\n",[112,26638,26639],{"class":114,"line":5008},[112,26640,272],{"emptyLinePlaceholder":271},[112,26642,26643,26645,26648,26650,26652],{"class":114,"line":5016},[112,26644,26505],{"class":229},[112,26646,26647],{"class":236}," (modelVersion ",[112,26649,14573],{"class":229},[112,26651,26365],{"class":122},[112,26653,526],{"class":236},[112,26655,26656],{"class":114,"line":5024},[112,26657,26658],{"class":578},"    // get the latest model from anthropic\n",[112,26660,26661,26663,26666,26668,26670,26673,26676],{"class":114,"line":5032},[112,26662,1435],{"class":229},[112,26664,26665],{"class":129}," models",[112,26667,354],{"class":229},[112,26669,539],{"class":229},[112,26671,26672],{"class":236}," anthropic.models.",[112,26674,26675],{"class":118},"list",[112,26677,1536],{"class":236},[112,26679,26680,26683,26685,26688,26690],{"class":114,"line":5040},[112,26681,26682],{"class":236},"    latestModel ",[112,26684,335],{"class":229},[112,26686,26687],{"class":236}," models.data[",[112,26689,660],{"class":129},[112,26691,26692],{"class":236},"].id;\n",[112,26694,26695,26697,26699],{"class":114,"line":5046},[112,26696,332],{"class":236},[112,26698,14616],{"class":229},[112,26700,280],{"class":236},[112,26702,26703,26705,26707],{"class":114,"line":5052},[112,26704,26682],{"class":236},[112,26706,335],{"class":229},[112,26708,26709],{"class":236}," modelVersion;\n",[112,26711,26712],{"class":114,"line":5061},[112,26713,584],{"class":236},[112,26715,26716],{"class":114,"line":5066},[112,26717,272],{"emptyLinePlaceholder":271},[112,26719,26720,26722,26725,26727,26729,26732,26734],{"class":114,"line":9217},[112,26721,277],{"class":229},[112,26723,26724],{"class":129}," completion",[112,26726,354],{"class":229},[112,26728,539],{"class":229},[112,26730,26731],{"class":236}," anthropic.beta.messages.",[112,26733,18060],{"class":118},[112,26735,363],{"class":236},[112,26737,26738],{"class":114,"line":9225},[112,26739,26740],{"class":236},"    model: latestModel,\n",[112,26742,26743,26746,26748],{"class":114,"line":9237},[112,26744,26745],{"class":236},"    max_tokens: ",[112,26747,973],{"class":129},[112,26749,288],{"class":236},[112,26751,26752],{"class":114,"line":9248},[112,26753,26754],{"class":236},"    messages: [\n",[112,26756,26757],{"class":114,"line":9253},[112,26758,4001],{"class":236},[112,26760,26761,26764,26766],{"class":114,"line":9261},[112,26762,26763],{"class":236},"            role: ",[112,26765,20061],{"class":122},[112,26767,288],{"class":236},[112,26769,26770],{"class":114,"line":9267},[112,26771,26772],{"class":236},"            content: message,\n",[112,26774,26775],{"class":114,"line":9272},[112,26776,4803],{"class":236},[112,26778,26779],{"class":114,"line":9280},[112,26780,9155],{"class":236},[112,26782,26783,26786,26788],{"class":114,"line":9293},[112,26784,26785],{"class":236},"    stream: ",[112,26787,4182],{"class":129},[112,26789,288],{"class":236},[112,26791,26792],{"class":114,"line":9304},[112,26793,26794],{"class":236},"    mcp_servers: [\n",[112,26796,26797],{"class":114,"line":9309},[112,26798,4001],{"class":236},[112,26800,26801,26804,26807],{"class":114,"line":9317},[112,26802,26803],{"class":236},"            type: ",[112,26805,26806],{"class":122},"'url'",[112,26808,288],{"class":236},[112,26810,26811,26814,26817,26819,26821,26823,26825,26827,26829,26831,26833,26835,26837,26839,26841],{"class":114,"line":9328},[112,26812,26813],{"class":236},"            url: ",[112,26815,26816],{"class":122},"`${",[112,26818,26597],{"class":236},[112,26820,634],{"class":122},[112,26822,26602],{"class":236},[112,26824,634],{"class":122},[112,26826,26607],{"class":129},[112,26828,26610],{"class":122},[112,26830,26613],{"class":236},[112,26832,634],{"class":122},[112,26834,13776],{"class":118},[112,26836,26620],{"class":122},[112,26838,640],{"class":122},[112,26840,1046],{"class":236},[112,26842,26843],{"class":578},"// change url as needed\n",[112,26845,26846,26849,26852],{"class":114,"line":9337},[112,26847,26848],{"class":236},"            name: ",[112,26850,26851],{"class":122},"'unifiedMCP'",[112,26853,288],{"class":236},[112,26855,26856],{"class":114,"line":9342},[112,26857,4803],{"class":236},[112,26859,26860],{"class":114,"line":9350},[112,26861,9155],{"class":236},[112,26863,26864,26867,26870],{"class":114,"line":9361},[112,26865,26866],{"class":236},"    betas: [",[112,26868,26869],{"class":122},"'mcp-client-2025-04-04'",[112,26871,3908],{"class":236},[112,26873,26874],{"class":114,"line":9371},[112,26875,384],{"class":236},[112,26877,26878],{"class":114,"line":9376},[112,26879,272],{"emptyLinePlaceholder":271},[112,26881,26882,26885,26887,26889,26892,26894,26896,26898,26900,26903,26906,26908,26911],{"class":114,"line":9384},[112,26883,26884],{"class":236},"console.",[112,26886,1512],{"class":118},[112,26888,456],{"class":236},[112,26890,26891],{"class":122},"'response'",[112,26893,1046],{"class":236},[112,26895,13765],{"class":129},[112,26897,634],{"class":236},[112,26899,13770],{"class":118},[112,26901,26902],{"class":236},"(completion, ",[112,26904,26905],{"class":129},"null",[112,26907,1046],{"class":236},[112,26909,26910],{"class":129},"2",[112,26912,24808],{"class":236},[67,26914,26916],{"id":26915},"coverage-and-infrastructure","Coverage and Infrastructure",[19,26918,26919],{},"Unified.to MCP is built for real-world AI use cases:",[72,26921,26922,26928,26934,26940,26946],{},[46,26923,26924,26927],{},[478,26925,26926],{},"20,421+ real-time tools"," (growing weekly)",[46,26929,26930,26933],{},[478,26931,26932],{},"335+ integrations across 21 categories"," (ATS, CRM, HRIS, Accounting, Messaging, File Storage, and more)",[46,26935,26936,26939],{},[478,26937,26938],{},"Zero-storage architecture"," — no caching, no liability",[46,26941,26942,26945],{},[478,26943,26944],{},"Scoped security controls"," — permissions, aliases, and PII redaction",[46,26947,26948,26951],{},[478,26949,26950],{},"Multi-region deployment"," — US, EU, and AU data centers for compliance",[19,26953,26954,26955,26958],{},"Unified.to MCP works across all major LLM providers: ",[478,26956,26957],{},"OpenAI, Anthropic, Google Gemini, and Cohere."," That means you can build once and connect to any agent client.",[19,26960,26961,9571,26966],{},[1614,26962,26965],{"href":26963,"rel":26964},"https://docs.unified.to/mcp?utm_source=chatgpt.com",[1618],"Explore the MCP docs",[1614,26967,26969],{"href":26963,"rel":26968},[1618],"book a demo",[10506,26971,26972],{},[19,26973,26974],{},[22,26975,26976],{},"Note: Unified.to MCP is currently in beta and should not be used in production systems yet. Contact us if you'd like to explore production use.",[1558,26978,26979],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":107,"searchDepth":126,"depth":126,"links":26981},[26982,26983,26984,26987],{"id":26020,"depth":126,"text":26021},{"id":26064,"depth":126,"text":26065},{"id":26286,"depth":126,"text":26287,"children":26985},[26986],{"id":26328,"depth":135,"text":26329},{"id":26915,"depth":126,"text":26916},"Anthropic's Claude models can power sophisticated workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting...",{"img":26990,"date":26991,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server-icon.png","2025-08-28T00:00:00.000Z","/guides/how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server",{"title":25996,"description":26988},"guides/how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server","LJUsTHbi-w3KRvFDif7fTBdMQg6rGuIsrq1YSkhYVe0",{"id":26997,"title":26998,"body":26999,"description":27805,"extension":1576,"meta":27806,"navigation":271,"path":27808,"seo":27809,"stem":27810,"__hash__":27811},"guides/guides/how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect Cohere to Real-Time SaaS Data with Unified.to MCP Server",{"type":9,"value":27000,"toc":27793},[27001,27004,27006,27010,27013,27016,27019,27021,27027,27029,27047,27055,27058,27062,27124,27128,27133,27142,27147,27177,27181,27190,27194,27197,27220,27223,27225,27734,27738,27741,27764,27767,27769,27774,27784,27790],[12,27002,26998],{"id":27003},"how-to-connect-cohere-to-real-time-saas-data-with-unifiedto-mcp-server",[16,27005],{},[19,27007,27008],{},[22,27009,26008],{},[19,27011,27012],{},"Cohere's LLMs can power rich workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That usually means writing brittle glue code, normalizing APIs, and maintaining webhook jobs.",[19,27014,27015],{},"With Unified.to's MCP server, you can skip that complexity. Unified.to exposes 317+ SaaS integrations as real-time, callable tools that Cohere can use directly — no custom integration logic required.",[19,27017,27018],{},"In this guide, we'll walk through how to connect Cohere to Unified.to MCP so your application can give Cohere real-time access to customer SaaS data and actions.",[67,27020,26021],{"id":26020},[19,27022,26024,27023,26028,27025,26032],{},[109,27024,26027],{},[109,27026,26031],{},[19,27028,26035],{},[72,27030,27031,27039],{},[46,27032,27033,27035,26045,27037,26049],{},[478,27034,26042],{},[17180,27036],{},[109,27038,26048],{},[46,27040,27041,27043,26057,27045,26061],{},[478,27042,26054],{},[17180,27044],{},[109,27046,26060],{},[67,27048,27050,27051,27054],{"id":27049},"integrating-unifiedto-mcp-server-with-cohere","Integrating ",[1614,27052,1640],{"href":1638,"rel":27053},[1618]," MCP Server with Cohere",[19,27056,27057],{},"Cohere's chat API can directly consume tools defined by Unified.to MCP.",[19,27059,27060],{},[478,27061,26070],{},[43,27063,27064,27115,27121],{},[46,27065,26075,27066,27069,27070],{},[109,27067,27068],{},"/tools?type=cohere"," endpoint and pass the tool list to Cohere:",[102,27071,27073],{"className":26082,"code":27072,"language":26084,"meta":107,"style":107},"response = co.chat(\n    model=\"command-a-03-2025\", messages=messages, tools=tools\n)\n",[109,27074,27075,27085,27111],{"__ignoreMap":107},[112,27076,27077,27080,27082],{"class":114,"line":115},[112,27078,27079],{"class":236},"response ",[112,27081,335],{"class":229},[112,27083,27084],{"class":236}," co.chat(\n",[112,27086,27087,27089,27091,27094,27096,27099,27101,27104,27106,27108],{"class":114,"line":126},[112,27088,26101],{"class":517},[112,27090,335],{"class":229},[112,27092,27093],{"class":122},"\"command-a-03-2025\"",[112,27095,1046],{"class":236},[112,27097,27098],{"class":517},"messages",[112,27100,335],{"class":229},[112,27102,27103],{"class":236},"messages, ",[112,27105,26303],{"class":517},[112,27107,335],{"class":229},[112,27109,27110],{"class":236},"tools\n",[112,27112,27113],{"class":114,"line":135},[112,27114,15267],{"class":236},[46,27116,27117,27118,27120],{},"When Cohere requests a tool call, call Unified's ",[109,27119,26222],{}," endpoint.",[46,27122,27123],{},"Pass the tool result back to Cohere in your next message",[35,27125,27127],{"id":27126},"example-prompt-and-response","Example Prompt and Response",[19,27129,27130],{},[478,27131,27132],{},"Prompt:",[102,27134,27136],{"className":174,"code":27135,"language":176,"meta":177,"style":107},"\"Score this candidate for the Software Engineer job.\"\n",[109,27137,27138],{"__ignoreMap":107},[112,27139,27140],{"class":114,"line":115},[112,27141,27135],{},[19,27143,27144],{},[478,27145,27146],{},"What happens:",[72,27148,27149,27161,27169,27174],{},[46,27150,27151,27152,1046,27155,1046,27158,772],{},"Cohere discovers the available tools from Unified MCP (e.g., ",[109,27153,27154],{},"fetch-candidate",[109,27156,27157],{},"fetch-job",[109,27159,27160],{},"score-candidate",[46,27162,27163,27164,11338,27166,27168],{},"Cohere calls ",[109,27165,27154],{},[109,27167,27157],{}," tools to get the data.",[46,27170,27163,27171,27173],{},[109,27172,27160],{}," with the data.",[46,27175,27176],{},"Cohere returns a response like:",[19,27178,27179],{},[478,27180,2718],{},[102,27182,27184],{"className":174,"code":27183,"language":176,"meta":177,"style":107},"Candidate Jane Doe scored 92/100 for the Software Engineer job. Strengths: Python, distributed systems. Recommended for interview.\n",[109,27185,27186],{"__ignoreMap":107},[112,27187,27188],{"class":114,"line":115},[112,27189,27183],{},[67,27191,27193],{"id":27192},"advanced-mcp-options","Advanced MCP Options",[19,27195,27196],{},"Unified.to MCP gives you granular control over how tools are exposed to Cohere:",[72,27198,27199,27203,27207,27212,27216],{},[46,27200,27201,26298],{},[109,27202,26297],{},[46,27204,27205,26304],{},[109,27206,26303],{},[46,27208,27209,27211],{},[109,27210,26309],{}," → add synonyms so Cohere better matches tool names.",[46,27213,27214,26316],{},[109,27215,26315],{},[46,27217,27218,26322],{},[109,27219,26321],{},[19,27221,27222],{},"These options help you keep Cohere outputs predictable and secure in production-grade workflows.",[35,27224,26329],{"id":26328},[102,27226,27228],{"className":9951,"code":27227,"language":9953,"meta":107,"style":107},"import { CohereClientV2 } from 'cohere-ai';\n\n// Unified connection Id that you want to have the mcp to use tools for\nconst connection = 'UNIFIED_CONNECTION_ID';\n // location from where your unified account was created\nconst dc = 'us';\n// Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\nconst cohereClient = new CohereClientV2({\n    token: process.env.COHERE_API_KEY || '',\n});\n\nconst params = new URLSearchParams({\n    token: process.env.UNIFIED_API_KEY || '',\n    connection,\n    type: 'cohere',\n    dc,\n    include_external_tools: includeExternal ? 'true' : 'false',\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst tools = await fetch(`${process.env.UNIFIED_MCP_URL}/tools?${params.toString()}`);\nconst toolsJson = await tools.json();\nconst completion = await cohereClient.chat({\n    model: 'command-a-03-2025',\n    messages: [\n        {\n            role: 'user',\n            content: message,\n        },\n    ],\n    tools: toolsJson,\n});\n\n\nfor (const toolCall of completion?.message?.toolCalls || []) {\n    // call mcp server with toolCallId\n    const toolCallResponse = await fetch(`${process.env.UNIFIED_MCP_URL}/mcp/tools/${toolCall.function?.name}/call?${params.toString()}`, {\n        method: 'POST',\n        body: toolCall.function?.arguments || '{}',\n    });\n    const toolCallResponseJson = await toolCallResponse.json();\n    console.log(JSON.stringify(toolCallResponseJson, null, 2));\n}\n",[109,27229,27230,27244,27248,27252,27264,27268,27280,27284,27302,27318,27331,27335,27339,27353,27365,27369,27378,27382,27396,27400,27404,27418,27438,27442,27446,27488,27506,27523,27532,27536,27540,27548,27552,27556,27560,27565,27569,27573,27577,27599,27604,27662,27671,27683,27687,27705,27730],{"__ignoreMap":107},[112,27231,27232,27234,27237,27239,27242],{"class":114,"line":115},[112,27233,230],{"class":229},[112,27235,27236],{"class":236}," { CohereClientV2 } ",[112,27238,247],{"class":229},[112,27240,27241],{"class":122}," 'cohere-ai'",[112,27243,237],{"class":236},[112,27245,27246],{"class":114,"line":126},[112,27247,272],{"emptyLinePlaceholder":271},[112,27249,27250],{"class":114,"line":135},[112,27251,26372],{"class":578},[112,27253,27254,27256,27258,27260,27262],{"class":114,"line":147},[112,27255,277],{"class":229},[112,27257,26379],{"class":129},[112,27259,354],{"class":229},[112,27261,26384],{"class":122},[112,27263,237],{"class":236},[112,27265,27266],{"class":114,"line":202},[112,27267,26391],{"class":578},[112,27269,27270,27272,27274,27276,27278],{"class":114,"line":208},[112,27271,277],{"class":229},[112,27273,26398],{"class":129},[112,27275,354],{"class":229},[112,27277,26403],{"class":122},[112,27279,237],{"class":236},[112,27281,27282],{"class":114,"line":291},[112,27283,26410],{"class":578},[112,27285,27286,27288,27290,27292,27294,27296,27298,27300],{"class":114,"line":299},[112,27287,277],{"class":229},[112,27289,26417],{"class":129},[112,27291,354],{"class":229},[112,27293,26422],{"class":236},[112,27295,26425],{"class":122},[112,27297,4877],{"class":236},[112,27299,26430],{"class":122},[112,27301,2794],{"class":236},[112,27303,27304,27306,27309,27311,27313,27316],{"class":114,"line":307},[112,27305,277],{"class":229},[112,27307,27308],{"class":129}," cohereClient",[112,27310,354],{"class":229},[112,27312,357],{"class":229},[112,27314,27315],{"class":118}," CohereClientV2",[112,27317,363],{"class":236},[112,27319,27320,27322,27325,27327,27329],{"class":114,"line":315},[112,27321,26456],{"class":236},[112,27323,27324],{"class":129},"COHERE_API_KEY",[112,27326,669],{"class":229},[112,27328,26463],{"class":122},[112,27330,288],{"class":236},[112,27332,27333],{"class":114,"line":323},[112,27334,384],{"class":236},[112,27336,27337],{"class":114,"line":329},[112,27338,272],{"emptyLinePlaceholder":271},[112,27340,27341,27343,27345,27347,27349,27351],{"class":114,"line":341},[112,27342,277],{"class":229},[112,27344,26443],{"class":129},[112,27346,354],{"class":229},[112,27348,357],{"class":229},[112,27350,17299],{"class":118},[112,27352,363],{"class":236},[112,27354,27355,27357,27359,27361,27363],{"class":114,"line":346},[112,27356,26456],{"class":236},[112,27358,372],{"class":129},[112,27360,669],{"class":229},[112,27362,26463],{"class":122},[112,27364,288],{"class":236},[112,27366,27367],{"class":114,"line":366},[112,27368,26470],{"class":236},[112,27370,27371,27373,27376],{"class":114,"line":381},[112,27372,18413],{"class":236},[112,27374,27375],{"class":122},"'cohere'",[112,27377,288],{"class":236},[112,27379,27380],{"class":114,"line":387},[112,27381,26475],{"class":236},[112,27383,27384,27386,27388,27390,27392,27394],{"class":114,"line":392},[112,27385,26480],{"class":236},[112,27387,4711],{"class":229},[112,27389,26485],{"class":122},[112,27391,25896],{"class":229},[112,27393,26490],{"class":122},[112,27395,288],{"class":236},[112,27397,27398],{"class":114,"line":409},[112,27399,384],{"class":236},[112,27401,27402],{"class":114,"line":422},[112,27403,272],{"emptyLinePlaceholder":271},[112,27405,27406,27408,27410,27412,27414,27416],{"class":114,"line":435},[112,27407,26505],{"class":229},[112,27409,26508],{"class":236},[112,27411,14591],{"class":129},[112,27413,26513],{"class":229},[112,27415,14450],{"class":129},[112,27417,526],{"class":236},[112,27419,27420,27422,27424,27426,27428,27430,27432,27434,27436],{"class":114,"line":440},[112,27421,26522],{"class":236},[112,27423,26525],{"class":118},[112,27425,456],{"class":236},[112,27427,26530],{"class":122},[112,27429,26533],{"class":236},[112,27431,775],{"class":118},[112,27433,456],{"class":236},[112,27435,26540],{"class":122},[112,27437,24808],{"class":236},[112,27439,27440],{"class":114,"line":4949},[112,27441,584],{"class":236},[112,27443,27444],{"class":114,"line":4960},[112,27445,272],{"emptyLinePlaceholder":271},[112,27447,27448,27450,27453,27455,27457,27459,27461,27463,27465,27467,27469,27471,27473,27476,27478,27480,27482,27484,27486],{"class":114,"line":4972},[112,27449,277],{"class":229},[112,27451,27452],{"class":129}," tools",[112,27454,354],{"class":229},[112,27456,539],{"class":229},[112,27458,17607],{"class":118},[112,27460,456],{"class":236},[112,27462,26816],{"class":122},[112,27464,26597],{"class":236},[112,27466,634],{"class":122},[112,27468,26602],{"class":236},[112,27470,634],{"class":122},[112,27472,26607],{"class":129},[112,27474,27475],{"class":122},"}/tools?${",[112,27477,26613],{"class":236},[112,27479,634],{"class":122},[112,27481,13776],{"class":118},[112,27483,26620],{"class":122},[112,27485,640],{"class":122},[112,27487,464],{"class":236},[112,27489,27490,27492,27495,27497,27499,27502,27504],{"class":114,"line":4984},[112,27491,277],{"class":229},[112,27493,27494],{"class":129}," toolsJson",[112,27496,354],{"class":229},[112,27498,539],{"class":229},[112,27500,27501],{"class":236}," tools.",[112,27503,2320],{"class":118},[112,27505,1536],{"class":236},[112,27507,27508,27510,27512,27514,27516,27519,27521],{"class":114,"line":4992},[112,27509,277],{"class":229},[112,27511,26724],{"class":129},[112,27513,354],{"class":229},[112,27515,539],{"class":229},[112,27517,27518],{"class":236}," cohereClient.",[112,27520,20046],{"class":118},[112,27522,363],{"class":236},[112,27524,27525,27527,27530],{"class":114,"line":5000},[112,27526,24336],{"class":236},[112,27528,27529],{"class":122},"'command-a-03-2025'",[112,27531,288],{"class":236},[112,27533,27534],{"class":114,"line":5008},[112,27535,26754],{"class":236},[112,27537,27538],{"class":114,"line":5016},[112,27539,4001],{"class":236},[112,27541,27542,27544,27546],{"class":114,"line":5024},[112,27543,26763],{"class":236},[112,27545,20061],{"class":122},[112,27547,288],{"class":236},[112,27549,27550],{"class":114,"line":5032},[112,27551,26772],{"class":236},[112,27553,27554],{"class":114,"line":5040},[112,27555,4803],{"class":236},[112,27557,27558],{"class":114,"line":5046},[112,27559,9155],{"class":236},[112,27561,27562],{"class":114,"line":5052},[112,27563,27564],{"class":236},"    tools: toolsJson,\n",[112,27566,27567],{"class":114,"line":5061},[112,27568,384],{"class":236},[112,27570,27571],{"class":114,"line":5066},[112,27572,272],{"emptyLinePlaceholder":271},[112,27574,27575],{"class":114,"line":9217},[112,27576,272],{"emptyLinePlaceholder":271},[112,27578,27579,27582,27584,27586,27589,27591,27594,27596],{"class":114,"line":9225},[112,27580,27581],{"class":229},"for",[112,27583,1419],{"class":236},[112,27585,277],{"class":229},[112,27587,27588],{"class":129}," toolCall",[112,27590,1427],{"class":229},[112,27592,27593],{"class":236}," completion?.message?.toolCalls ",[112,27595,1109],{"class":229},[112,27597,27598],{"class":236}," []) {\n",[112,27600,27601],{"class":114,"line":9237},[112,27602,27603],{"class":578},"    // call mcp server with toolCallId\n",[112,27605,27606,27608,27611,27613,27615,27617,27619,27621,27623,27625,27627,27629,27631,27634,27637,27639,27641,27644,27646,27649,27651,27653,27655,27657,27659],{"class":114,"line":9248},[112,27607,1435],{"class":229},[112,27609,27610],{"class":129}," toolCallResponse",[112,27612,354],{"class":229},[112,27614,539],{"class":229},[112,27616,17607],{"class":118},[112,27618,456],{"class":236},[112,27620,26816],{"class":122},[112,27622,26597],{"class":236},[112,27624,634],{"class":122},[112,27626,26602],{"class":236},[112,27628,634],{"class":122},[112,27630,26607],{"class":129},[112,27632,27633],{"class":122},"}/mcp/tools/${",[112,27635,27636],{"class":236},"toolCall",[112,27638,634],{"class":122},[112,27640,9978],{"class":236},[112,27642,27643],{"class":122},"?.",[112,27645,637],{"class":236},[112,27647,27648],{"class":122},"}/call?${",[112,27650,26613],{"class":236},[112,27652,634],{"class":122},[112,27654,13776],{"class":118},[112,27656,26620],{"class":122},[112,27658,640],{"class":122},[112,27660,27661],{"class":236},", {\n",[112,27663,27664,27667,27669],{"class":114,"line":9253},[112,27665,27666],{"class":236},"        method: ",[112,27668,18547],{"class":122},[112,27670,288],{"class":236},[112,27672,27673,27676,27678,27681],{"class":114,"line":9261},[112,27674,27675],{"class":236},"        body: toolCall.function?.arguments ",[112,27677,1109],{"class":229},[112,27679,27680],{"class":122}," '{}'",[112,27682,288],{"class":236},[112,27684,27685],{"class":114,"line":9267},[112,27686,15149],{"class":236},[112,27688,27689,27691,27694,27696,27698,27701,27703],{"class":114,"line":9272},[112,27690,1435],{"class":229},[112,27692,27693],{"class":129}," toolCallResponseJson",[112,27695,354],{"class":229},[112,27697,539],{"class":229},[112,27699,27700],{"class":236}," toolCallResponse.",[112,27702,2320],{"class":118},[112,27704,1536],{"class":236},[112,27706,27707,27709,27711,27713,27715,27717,27719,27722,27724,27726,27728],{"class":114,"line":9280},[112,27708,17339],{"class":236},[112,27710,1512],{"class":118},[112,27712,456],{"class":236},[112,27714,13765],{"class":129},[112,27716,634],{"class":236},[112,27718,13770],{"class":118},[112,27720,27721],{"class":236},"(toolCallResponseJson, ",[112,27723,26905],{"class":129},[112,27725,1046],{"class":236},[112,27727,26910],{"class":129},[112,27729,24808],{"class":236},[112,27731,27732],{"class":114,"line":9293},[112,27733,584],{"class":236},[67,27735,27737],{"id":27736},"the-most-complete-mcp-server-for-ai-native-teams","The Most Complete MCP Server for AI-Native Teams",[19,27739,27740],{},"Unified.to MCP is the most complete hosted MCP server available today:",[72,27742,27743,27748,27752,27756,27760],{},[46,27744,27745,26927],{},[478,27746,27747],{},"20,082+ real-time tools",[46,27749,27750,26933],{},[478,27751,26932],{},[46,27753,27754,26939],{},[478,27755,26938],{},[46,27757,27758,26945],{},[478,27759,26944],{},[46,27761,27762,26951],{},[478,27763,26950],{},[19,27765,27766],{},"This ensures your Cohere workflows aren't just demos — they're secure, scalable, and designed for production-grade use cases.",[67,27768,12094],{"id":10172},[19,27770,26954,27771,26958],{},[478,27772,27773],{},"OpenAI, Anthropic, Google Gemini and Cohere.",[19,27775,27776,9571,27779,27783],{},[1614,27777,26965],{"href":26963,"rel":27778},[1618],[1614,27780,26969],{"href":27781,"rel":27782},"https://calendly.com/d/cph9-g8n-jzg/connect-with-unified?utm_source=chatgpt.com",[1618]," to see it live in action.",[10506,27785,27786],{},[19,27787,27788],{},[22,27789,26976],{},[1558,27791,27792],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":107,"searchDepth":126,"depth":126,"links":27794},[27795,27796,27800,27803,27804],{"id":26020,"depth":126,"text":26021},{"id":27049,"depth":126,"text":27797,"children":27798},"Integrating Unified.to MCP Server with Cohere",[27799],{"id":27126,"depth":135,"text":27127},{"id":27192,"depth":126,"text":27193,"children":27801},[27802],{"id":26328,"depth":135,"text":26329},{"id":27736,"depth":126,"text":27737},{"id":10172,"depth":126,"text":12094},"Cohere's LLMs can power rich workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That usually...",{"img":27807,"date":26991,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server-icon.png","/guides/how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server",{"title":26998,"description":27805},"guides/how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server","4RsrdDMd2Otmx2vNRfAKogjlCMzfdw5W8VQMyNPGYhM",{"id":27813,"title":27814,"body":27815,"description":28818,"extension":1576,"meta":28819,"navigation":271,"path":28821,"seo":28822,"stem":28823,"__hash__":28824},"guides/guides/how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect Google Gemini to Real-Time SaaS Data with Unified.to MCP Server",{"type":9,"value":27816,"toc":28810},[27817,27820,27822,27826,27833,27844,27847,27849,27855,27857,27875,27879,27883,28009,28011,28014,28038,28041,28044,28758,28760,28762,28784,28788,28801,28807],[12,27818,27814],{"id":27819},"how-to-connect-google-gemini-to-real-time-saas-data-with-unifiedto-mcp-server",[16,27821],{},[19,27823,27824],{},[22,27825,26008],{},[19,27827,27828,27829,27832],{},"Google Gemini can power powerful workflows — but most products still need access to ",[478,27830,27831],{},"live customer data"," from CRMs, ATSs, HRIS, or accounting systems. That usually means writing brittle glue code, normalizing APIs, and maintaining webhook jobs.",[19,27834,27835,27836,27839,27840,27843],{},"With ",[478,27837,27838],{},"Unified.to's MCP server",", you can skip that complexity. Unified.to exposes 317+ SaaS integrations as ",[478,27841,27842],{},"real-time, callable tools"," that Gemini can use directly — no custom integration logic required.",[19,27845,27846],{},"In this guide, we'll walk through how to connect Gemini to Unified.to MCP so your application can give Gemini real-time access to customer SaaS data and actions.",[67,27848,26021],{"id":26020},[19,27850,26024,27851,26028,27853,26032],{},[109,27852,26027],{},[109,27854,26031],{},[19,27856,26035],{},[72,27858,27859,27867],{},[46,27860,27861,27863,26045,27865,26049],{},[478,27862,26042],{},[17180,27864],{},[109,27866,26048],{},[46,27868,27869,27871,26057,27873,26061],{},[478,27870,26054],{},[17180,27872],{},[109,27874,26060],{},[67,27876,27878],{"id":27877},"integrating-with-google-gemini-api","Integrating with Google Gemini API",[19,27880,27881],{},[478,27882,26070],{},[43,27884,27885,27894,27921,27925],{},[46,27886,26075,27887,27889,27890,27893],{},[109,27888,26078],{}," endpoint and pass the tool list as ",[109,27891,27892],{},"function_declarations"," to Gemini.",[46,27895,27896,27897],{},"Gemini will return a function call request:",[102,27898,27900],{"className":174,"code":27899,"language":176,"meta":177,"style":107},"function_call {\n  name: \"list_candidates\"\n  args { fields { key: \"limit\" value { string_value: \"100\" } } }\n}\n",[109,27901,27902,27907,27912,27917],{"__ignoreMap":107},[112,27903,27904],{"class":114,"line":115},[112,27905,27906],{},"function_call {\n",[112,27908,27909],{"class":114,"line":126},[112,27910,27911],{},"  name: \"list_candidates\"\n",[112,27913,27914],{"class":114,"line":135},[112,27915,27916],{},"  args { fields { key: \"limit\" value { string_value: \"100\" } } }\n",[112,27918,27919],{"class":114,"line":147},[112,27920,584],{},[46,27922,26075,27923,27120],{},[109,27924,26222],{},[46,27926,27927,27928,27931,27932],{},"Respond to Gemini with the tool result as a ",[109,27929,27930],{},"functionResponse"," in your next message:",[102,27933,27935],{"className":2318,"code":27934,"language":2320,"meta":107,"style":107},"{\n  \"role\": \"user\",\n  \"parts\": [\n    {\n      \"functionResponse\": {\n        \"name\": \"list_candidates\",\n        \"response\": { ... }\n      }\n    }\n  ]\n}\n",[109,27936,27937,27941,27953,27960,27964,27971,27982,27993,27997,28001,28005],{"__ignoreMap":107},[112,27938,27939],{"class":114,"line":115},[112,27940,2327],{"class":236},[112,27942,27943,27946,27948,27951],{"class":114,"line":126},[112,27944,27945],{"class":129},"  \"role\"",[112,27947,2335],{"class":236},[112,27949,27950],{"class":122},"\"user\"",[112,27952,288],{"class":236},[112,27954,27955,27958],{"class":114,"line":135},[112,27956,27957],{"class":129},"  \"parts\"",[112,27959,2372],{"class":236},[112,27961,27962],{"class":114,"line":147},[112,27963,1076],{"class":236},[112,27965,27966,27969],{"class":114,"line":202},[112,27967,27968],{"class":129},"      \"functionResponse\"",[112,27970,3888],{"class":236},[112,27972,27973,27976,27978,27980],{"class":114,"line":208},[112,27974,27975],{"class":129},"        \"name\"",[112,27977,2335],{"class":236},[112,27979,26189],{"class":122},[112,27981,288],{"class":236},[112,27983,27984,27987,27989,27991],{"class":114,"line":291},[112,27985,27986],{"class":129},"        \"response\"",[112,27988,26199],{"class":236},[112,27990,14552],{"class":2885},[112,27992,2398],{"class":236},[112,27994,27995],{"class":114,"line":299},[112,27996,17649],{"class":236},[112,27998,27999],{"class":114,"line":307},[112,28000,3946],{"class":236},[112,28002,28003],{"class":114,"line":315},[112,28004,2403],{"class":236},[112,28006,28007],{"class":114,"line":323},[112,28008,584],{"class":236},[67,28010,26287],{"id":26286},[19,28012,28013],{},"Unified.to MCP gives you granular control over how tools are exposed to Gemini:",[72,28015,28016,28020,28024,28029,28034],{},[46,28017,28018,26298],{},[109,28019,26297],{},[46,28021,28022,26304],{},[109,28023,26303],{},[46,28025,28026,28028],{},[109,28027,26309],{}," → add synonyms so Gemini can perform better matches for tool names.",[46,28030,28031,28033],{},[109,28032,26315],{}," → automatically strip PII (emails, phone numbers, name, gender, etc).",[46,28035,28036,26322],{},[109,28037,26321],{},[19,28039,28040],{},"These options help you keep Gemini outputs predictable and secure in production-grade workflows.",[35,28042,28043],{"id":26328},"Sample Snippet:",[102,28045,28047],{"className":9951,"code":28046,"language":9953,"meta":107,"style":107},"import { GoogleGenAI, mcpToTool } from '@google/genai';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\n// Construct a new GEMINI client via GoogleGenAI\n\n// Gemini model version\nconst modelVersion = 'latest';\n// Unified connection Id that you want to have the mcp to use tools for\nconst connection = 'UNIFIED_CONNECTION_ID';\n // location from where your unified account was created\nconst dc = 'us';\n// Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\n\nconst gemini = new GoogleGenAI({\n    apiKey: process.env.GEMINI_API_KEY || '',\n});\n\n// Construct the required params\nconst params = new URLSearchParams({\n    token: process.env.UNIFIED_API_KEY || '',\n    connection,\n    type: 'gemini',\n    dc,\n    include_external_tools: true, // set to false if you don't want to include external tools\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst serverUrl = `${process.env.UNIFIED_MCP_URL}/mcp?${params.toString()}`;\n\nconst transport = new StreamableHTTPClientTransport(new URL(serverUrl));\nconst client = new Client({\n    name: 'unified-mcp',\n    version: '1.0.0',\n});\n\nawait client.connect(transport);\n\nlet latestModel;\n// Optional \nif (modelVersion === 'latest') {\n    // get the latest model from gemini\n    const models = await gemini.models.list();\n    latestModel = models.page.filter((model: any) => model.name.includes('gemini') && !model.name.includes('embedding')).pop()?.name || 'gemini-2.0-flash';\n} else {\n    latestModel = modelVersion;\n}\n\nconst completion = await gemini.models.generateContent({\n    model: latestModel?.replace('model/', ''),\n    contents: message,\n    config: {\n        tools: [mcpToTool(client)],\n    },\n});\n\nfor (const chunk of completion?.candidates || []) {\n    console.log(JSON.stringify(chunk, null, 2));\n    if (chunk.content?.parts) {\n        for (const part of chunk.content.parts) {\n            if (part.text) {\n                console.log(part.text);\n            }\n        }\n    }\n}\n",[109,28048,28049,28063,28077,28091,28096,28100,28105,28117,28121,28133,28137,28149,28153,28171,28175,28191,28204,28208,28212,28217,28231,28243,28247,28256,28260,28272,28276,28280,28294,28314,28318,28322,28357,28361,28385,28401,28410,28420,28424,28428,28442,28446,28452,28457,28469,28474,28491,28559,28567,28575,28579,28583,28600,28621,28626,28631,28642,28646,28650,28654,28674,28699,28706,28723,28731,28741,28746,28750,28754],{"__ignoreMap":107},[112,28050,28051,28053,28056,28058,28061],{"class":114,"line":115},[112,28052,230],{"class":229},[112,28054,28055],{"class":236}," { GoogleGenAI, mcpToTool } ",[112,28057,247],{"class":229},[112,28059,28060],{"class":122}," '@google/genai'",[112,28062,237],{"class":236},[112,28064,28065,28067,28070,28072,28075],{"class":114,"line":126},[112,28066,230],{"class":229},[112,28068,28069],{"class":236}," { Client } ",[112,28071,247],{"class":229},[112,28073,28074],{"class":122}," '@modelcontextprotocol/sdk/client/index.js'",[112,28076,237],{"class":236},[112,28078,28079,28081,28084,28086,28089],{"class":114,"line":135},[112,28080,230],{"class":229},[112,28082,28083],{"class":236}," { StreamableHTTPClientTransport } ",[112,28085,247],{"class":229},[112,28087,28088],{"class":122}," '@modelcontextprotocol/sdk/client/streamableHttp.js'",[112,28090,237],{"class":236},[112,28092,28093],{"class":114,"line":147},[112,28094,28095],{"class":578},"// Construct a new GEMINI client via GoogleGenAI\n",[112,28097,28098],{"class":114,"line":202},[112,28099,272],{"emptyLinePlaceholder":271},[112,28101,28102],{"class":114,"line":208},[112,28103,28104],{"class":578},"// Gemini model version\n",[112,28106,28107,28109,28111,28113,28115],{"class":114,"line":291},[112,28108,277],{"class":229},[112,28110,26360],{"class":129},[112,28112,354],{"class":229},[112,28114,26365],{"class":122},[112,28116,237],{"class":236},[112,28118,28119],{"class":114,"line":299},[112,28120,26372],{"class":578},[112,28122,28123,28125,28127,28129,28131],{"class":114,"line":307},[112,28124,277],{"class":229},[112,28126,26379],{"class":129},[112,28128,354],{"class":229},[112,28130,26384],{"class":122},[112,28132,237],{"class":236},[112,28134,28135],{"class":114,"line":315},[112,28136,26391],{"class":578},[112,28138,28139,28141,28143,28145,28147],{"class":114,"line":323},[112,28140,277],{"class":229},[112,28142,26398],{"class":129},[112,28144,354],{"class":229},[112,28146,26403],{"class":122},[112,28148,237],{"class":236},[112,28150,28151],{"class":114,"line":329},[112,28152,26410],{"class":578},[112,28154,28155,28157,28159,28161,28163,28165,28167,28169],{"class":114,"line":341},[112,28156,277],{"class":229},[112,28158,26417],{"class":129},[112,28160,354],{"class":229},[112,28162,26422],{"class":236},[112,28164,26425],{"class":122},[112,28166,4877],{"class":236},[112,28168,26430],{"class":122},[112,28170,2794],{"class":236},[112,28172,28173],{"class":114,"line":346},[112,28174,272],{"emptyLinePlaceholder":271},[112,28176,28177,28179,28182,28184,28186,28189],{"class":114,"line":366},[112,28178,277],{"class":229},[112,28180,28181],{"class":129}," gemini",[112,28183,354],{"class":229},[112,28185,357],{"class":229},[112,28187,28188],{"class":118}," GoogleGenAI",[112,28190,363],{"class":236},[112,28192,28193,28195,28198,28200,28202],{"class":114,"line":381},[112,28194,19714],{"class":236},[112,28196,28197],{"class":129},"GEMINI_API_KEY",[112,28199,669],{"class":229},[112,28201,26463],{"class":122},[112,28203,288],{"class":236},[112,28205,28206],{"class":114,"line":387},[112,28207,384],{"class":236},[112,28209,28210],{"class":114,"line":392},[112,28211,272],{"emptyLinePlaceholder":271},[112,28213,28214],{"class":114,"line":409},[112,28215,28216],{"class":578},"// Construct the required params\n",[112,28218,28219,28221,28223,28225,28227,28229],{"class":114,"line":422},[112,28220,277],{"class":229},[112,28222,26443],{"class":129},[112,28224,354],{"class":229},[112,28226,357],{"class":229},[112,28228,17299],{"class":118},[112,28230,363],{"class":236},[112,28232,28233,28235,28237,28239,28241],{"class":114,"line":435},[112,28234,26456],{"class":236},[112,28236,372],{"class":129},[112,28238,669],{"class":229},[112,28240,26463],{"class":122},[112,28242,288],{"class":236},[112,28244,28245],{"class":114,"line":440},[112,28246,26470],{"class":236},[112,28248,28249,28251,28254],{"class":114,"line":4949},[112,28250,18413],{"class":236},[112,28252,28253],{"class":122},"'gemini'",[112,28255,288],{"class":236},[112,28257,28258],{"class":114,"line":4960},[112,28259,26475],{"class":236},[112,28261,28262,28265,28267,28269],{"class":114,"line":4972},[112,28263,28264],{"class":236},"    include_external_tools: ",[112,28266,1340],{"class":129},[112,28268,1046],{"class":236},[112,28270,28271],{"class":578},"// set to false if you don't want to include external tools\n",[112,28273,28274],{"class":114,"line":4984},[112,28275,384],{"class":236},[112,28277,28278],{"class":114,"line":4992},[112,28279,272],{"emptyLinePlaceholder":271},[112,28281,28282,28284,28286,28288,28290,28292],{"class":114,"line":5000},[112,28283,26505],{"class":229},[112,28285,26508],{"class":236},[112,28287,14591],{"class":129},[112,28289,26513],{"class":229},[112,28291,14450],{"class":129},[112,28293,526],{"class":236},[112,28295,28296,28298,28300,28302,28304,28306,28308,28310,28312],{"class":114,"line":5008},[112,28297,26522],{"class":236},[112,28299,26525],{"class":118},[112,28301,456],{"class":236},[112,28303,26530],{"class":122},[112,28305,26533],{"class":236},[112,28307,775],{"class":118},[112,28309,456],{"class":236},[112,28311,26540],{"class":122},[112,28313,24808],{"class":236},[112,28315,28316],{"class":114,"line":5016},[112,28317,584],{"class":236},[112,28319,28320],{"class":114,"line":5024},[112,28321,272],{"emptyLinePlaceholder":271},[112,28323,28324,28326,28328,28330,28332,28334,28336,28338,28340,28342,28345,28347,28349,28351,28353,28355],{"class":114,"line":5032},[112,28325,277],{"class":229},[112,28327,26590],{"class":129},[112,28329,354],{"class":229},[112,28331,751],{"class":122},[112,28333,26597],{"class":236},[112,28335,634],{"class":122},[112,28337,26602],{"class":236},[112,28339,634],{"class":122},[112,28341,26607],{"class":129},[112,28343,28344],{"class":122},"}/mcp?${",[112,28346,26613],{"class":236},[112,28348,634],{"class":122},[112,28350,13776],{"class":118},[112,28352,26620],{"class":122},[112,28354,640],{"class":122},[112,28356,237],{"class":236},[112,28358,28359],{"class":114,"line":5040},[112,28360,272],{"emptyLinePlaceholder":271},[112,28362,28363,28365,28368,28370,28372,28375,28377,28379,28382],{"class":114,"line":5046},[112,28364,277],{"class":229},[112,28366,28367],{"class":129}," transport",[112,28369,354],{"class":229},[112,28371,357],{"class":229},[112,28373,28374],{"class":118}," StreamableHTTPClientTransport",[112,28376,456],{"class":236},[112,28378,24266],{"class":229},[112,28380,28381],{"class":118}," URL",[112,28383,28384],{"class":236},"(serverUrl));\n",[112,28386,28387,28389,28392,28394,28396,28399],{"class":114,"line":5052},[112,28388,277],{"class":229},[112,28390,28391],{"class":129}," client",[112,28393,354],{"class":229},[112,28395,357],{"class":229},[112,28397,28398],{"class":118}," Client",[112,28400,363],{"class":236},[112,28402,28403,28405,28408],{"class":114,"line":5061},[112,28404,18067],{"class":236},[112,28406,28407],{"class":122},"'unified-mcp'",[112,28409,288],{"class":236},[112,28411,28412,28415,28418],{"class":114,"line":5066},[112,28413,28414],{"class":236},"    version: ",[112,28416,28417],{"class":122},"'1.0.0'",[112,28419,288],{"class":236},[112,28421,28422],{"class":114,"line":9217},[112,28423,384],{"class":236},[112,28425,28426],{"class":114,"line":9225},[112,28427,272],{"emptyLinePlaceholder":271},[112,28429,28430,28433,28436,28439],{"class":114,"line":9237},[112,28431,28432],{"class":229},"await",[112,28434,28435],{"class":236}," client.",[112,28437,28438],{"class":118},"connect",[112,28440,28441],{"class":236},"(transport);\n",[112,28443,28444],{"class":114,"line":9248},[112,28445,272],{"emptyLinePlaceholder":271},[112,28447,28448,28450],{"class":114,"line":9253},[112,28449,26633],{"class":229},[112,28451,26636],{"class":236},[112,28453,28454],{"class":114,"line":9261},[112,28455,28456],{"class":578},"// Optional \n",[112,28458,28459,28461,28463,28465,28467],{"class":114,"line":9267},[112,28460,26505],{"class":229},[112,28462,26647],{"class":236},[112,28464,14573],{"class":229},[112,28466,26365],{"class":122},[112,28468,526],{"class":236},[112,28470,28471],{"class":114,"line":9272},[112,28472,28473],{"class":578},"    // get the latest model from gemini\n",[112,28475,28476,28478,28480,28482,28484,28487,28489],{"class":114,"line":9280},[112,28477,1435],{"class":229},[112,28479,26665],{"class":129},[112,28481,354],{"class":229},[112,28483,539],{"class":229},[112,28485,28486],{"class":236}," gemini.models.",[112,28488,26675],{"class":118},[112,28490,1536],{"class":236},[112,28492,28493,28495,28497,28500,28502,28504,28507,28509,28511,28513,28515,28518,28521,28523,28525,28527,28530,28533,28536,28538,28540,28543,28546,28549,28552,28554,28557],{"class":114,"line":9293},[112,28494,26682],{"class":236},[112,28496,335],{"class":229},[112,28498,28499],{"class":236}," models.page.",[112,28501,14558],{"class":118},[112,28503,735],{"class":236},[112,28505,28506],{"class":517},"model",[112,28508,171],{"class":229},[112,28510,607],{"class":129},[112,28512,745],{"class":236},[112,28514,748],{"class":229},[112,28516,28517],{"class":236}," model.name.",[112,28519,28520],{"class":118},"includes",[112,28522,456],{"class":236},[112,28524,28253],{"class":122},[112,28526,745],{"class":236},[112,28528,28529],{"class":229},"&&",[112,28531,28532],{"class":229}," !",[112,28534,28535],{"class":236},"model.name.",[112,28537,28520],{"class":118},[112,28539,456],{"class":236},[112,28541,28542],{"class":122},"'embedding'",[112,28544,28545],{"class":236},")).",[112,28547,28548],{"class":118},"pop",[112,28550,28551],{"class":236},"()?.name ",[112,28553,1109],{"class":229},[112,28555,28556],{"class":122}," 'gemini-2.0-flash'",[112,28558,237],{"class":236},[112,28560,28561,28563,28565],{"class":114,"line":9304},[112,28562,332],{"class":236},[112,28564,14616],{"class":229},[112,28566,280],{"class":236},[112,28568,28569,28571,28573],{"class":114,"line":9309},[112,28570,26682],{"class":236},[112,28572,335],{"class":229},[112,28574,26709],{"class":236},[112,28576,28577],{"class":114,"line":9317},[112,28578,584],{"class":236},[112,28580,28581],{"class":114,"line":9328},[112,28582,272],{"emptyLinePlaceholder":271},[112,28584,28585,28587,28589,28591,28593,28595,28598],{"class":114,"line":9337},[112,28586,277],{"class":229},[112,28588,26724],{"class":129},[112,28590,354],{"class":229},[112,28592,539],{"class":229},[112,28594,28486],{"class":236},[112,28596,28597],{"class":118},"generateContent",[112,28599,363],{"class":236},[112,28601,28602,28605,28608,28610,28613,28615,28618],{"class":114,"line":9342},[112,28603,28604],{"class":236},"    model: latestModel?.",[112,28606,28607],{"class":118},"replace",[112,28609,456],{"class":236},[112,28611,28612],{"class":122},"'model/'",[112,28614,1046],{"class":236},[112,28616,28617],{"class":122},"''",[112,28619,28620],{"class":236},"),\n",[112,28622,28623],{"class":114,"line":9350},[112,28624,28625],{"class":236},"    contents: message,\n",[112,28627,28628],{"class":114,"line":9361},[112,28629,28630],{"class":236},"    config: {\n",[112,28632,28633,28636,28639],{"class":114,"line":9371},[112,28634,28635],{"class":236},"        tools: [",[112,28637,28638],{"class":118},"mcpToTool",[112,28640,28641],{"class":236},"(client)],\n",[112,28643,28644],{"class":114,"line":9376},[112,28645,988],{"class":236},[112,28647,28648],{"class":114,"line":9384},[112,28649,384],{"class":236},[112,28651,28652],{"class":114,"line":9396},[112,28653,272],{"emptyLinePlaceholder":271},[112,28655,28656,28658,28660,28662,28665,28667,28670,28672],{"class":114,"line":9405},[112,28657,27581],{"class":229},[112,28659,1419],{"class":236},[112,28661,277],{"class":229},[112,28663,28664],{"class":129}," chunk",[112,28666,1427],{"class":229},[112,28668,28669],{"class":236}," completion?.candidates ",[112,28671,1109],{"class":229},[112,28673,27598],{"class":236},[112,28675,28676,28678,28680,28682,28684,28686,28688,28691,28693,28695,28697],{"class":114,"line":9410},[112,28677,17339],{"class":236},[112,28679,1512],{"class":118},[112,28681,456],{"class":236},[112,28683,13765],{"class":129},[112,28685,634],{"class":236},[112,28687,13770],{"class":118},[112,28689,28690],{"class":236},"(chunk, ",[112,28692,26905],{"class":129},[112,28694,1046],{"class":236},[112,28696,26910],{"class":129},[112,28698,24808],{"class":236},[112,28700,28701,28703],{"class":114,"line":9422},[112,28702,15209],{"class":229},[112,28704,28705],{"class":236}," (chunk.content?.parts) {\n",[112,28707,28708,28711,28713,28715,28718,28720],{"class":114,"line":9434},[112,28709,28710],{"class":229},"        for",[112,28712,1419],{"class":236},[112,28714,277],{"class":229},[112,28716,28717],{"class":129}," part",[112,28719,1427],{"class":229},[112,28721,28722],{"class":236}," chunk.content.parts) {\n",[112,28724,28725,28728],{"class":114,"line":9447},[112,28726,28727],{"class":229},"            if",[112,28729,28730],{"class":236}," (part.text) {\n",[112,28732,28733,28736,28738],{"class":114,"line":9459},[112,28734,28735],{"class":236},"                console.",[112,28737,1512],{"class":118},[112,28739,28740],{"class":236},"(part.text);\n",[112,28742,28743],{"class":114,"line":9472},[112,28744,28745],{"class":236},"            }\n",[112,28747,28748],{"class":114,"line":9485},[112,28749,4052],{"class":236},[112,28751,28752],{"class":114,"line":9498},[112,28753,3946],{"class":236},[112,28755,28756],{"class":114,"line":9509},[112,28757,584],{"class":236},[67,28759,26916],{"id":26915},[19,28761,26919],{},[72,28763,28764,28768,28772,28776,28780],{},[46,28765,28766,26927],{},[478,28767,26926],{},[46,28769,28770,26933],{},[478,28771,26932],{},[46,28773,28774,26939],{},[478,28775,26938],{},[46,28777,28778,26945],{},[478,28779,26944],{},[46,28781,28782,26951],{},[478,28783,26950],{},[19,28785,26954,28786,26958],{},[478,28787,26957],{},[72,28789,28790,28795],{},[46,28791,28792],{},[1614,28793,26965],{"href":26963,"rel":28794},[1618],[46,28796,28797],{},[1614,28798,28800],{"href":27781,"rel":28799},[1618],"Book a demo",[10506,28802,28803],{},[19,28804,28805],{},[22,28806,26976],{},[1558,28808,28809],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}",{"title":107,"searchDepth":126,"depth":126,"links":28811},[28812,28813,28814,28817],{"id":26020,"depth":126,"text":26021},{"id":27877,"depth":126,"text":27878},{"id":26286,"depth":126,"text":26287,"children":28815},[28816],{"id":26328,"depth":135,"text":28043},{"id":26915,"depth":126,"text":26916},"Google Gemini can power powerful workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That...",{"img":28820,"date":26991,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server-icon.png","/guides/how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server",{"title":27814,"description":28818},"guides/how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server","tJIpRoURerZCHYfvEjjhq7E7Y74yxZHDl9S0u09SgCU",{"id":28826,"title":28827,"body":28828,"description":29954,"extension":1576,"meta":29955,"navigation":271,"path":29958,"seo":29959,"stem":29960,"__hash__":29961},"guides/guides/how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect LLMs to Real-Time SaaS Data with Unified.to MCP Server",{"type":9,"value":28829,"toc":29940},[28830,28833,28835,28840,28848,28857,28861,28864,28879,28881,28890,28895,28905,28909,29032,29036,29042,29084,29088,29095,29344,29348,29351,29355,29358,29364,29525,29530,29532,29536,29710,29712,29716,29824,29828,29832,29882,29884,29888,29896,29900,29925,29929,29937],[12,28831,28827],{"id":28832},"how-to-connect-llms-to-real-time-saas-data-with-unifiedto-mcp-server",[16,28834],{},[19,28836,28837],{},[22,28838,28839],{},"August 25, 2025",[19,28841,28842,28847],{},[1614,28843,28846],{"href":28844,"rel":28845},"https://docs.unified.to/mcp",[1618],"Unified's MCP"," server allows your application to give an LLM API real-time access to your customers' SaaS data and perform actions on that data — without you having to write custom business-logic code for every integration, which can often make things messy.",[19,28849,28850,28851,28856],{},"For example, imagine you're building a ",[1614,28852,28855],{"href":28853,"rel":28854},"https://docs.unified.to/guides/how_to_build_a_candidate_assessment_product_with_unified",[1618],"candidate assessment workflow",", we'd usually call the API to fetch the data, and feed it into the LLM for it to analyze that data. With the Unified MCP server, we can enable OpenAI (or another LLM API) to directly access the data and perform actions making the workflow much simpler and cleaner.",[67,28858,28860],{"id":28859},"the-flow","The Flow",[19,28862,28863],{},"Here's how an LLM API connects to Unified's MCP server:",[72,28865,28866,28869,28876],{},[46,28867,28868],{},"Your app connects to the MCP server using the HTTP endpoint.",[46,28870,28871,28872,28875],{},"You authenticate using you ",[1614,28873,1640],{"href":1638,"rel":28874},[1618]," API token generated and provider one of your customer's connection ID.",[46,28877,28878],{},"The LLM can then discover and call tools (like 'fetch candidate', 'score candidate', 'update job status') in real time.",[67,28880,26021],{"id":26020},[19,28882,28883,28884,28887,28888,772],{},"You must provide a token to the MCP server as a URL parameter (",[109,28885,28886],{},"?token={token}",") or in the Authorization header (",[109,28889,26031],{},[19,28891,28892],{},[478,28893,28894],{},"Private (Direct LLM API):",[19,28896,28897,28898,28901,28902,28904],{},"Use your ",[1614,28899,1640],{"href":1638,"rel":28900},[1618]," workspace API key as the token, and include a ",[109,28903,26048],{}," parameter for the customer's connection ID.",[19,28906,28907],{},[22,28908,10603],{},[102,28910,28912],{"className":174,"code":28911,"language":176,"meta":177,"style":107},"\u003Chttps://mcp-api.unified.to/mcp?token=>\u003CYOUR_API_KEY>&connection=\u003CCONNECTION_ID>\n```\n\n\n_Note: Do not expose this token publicly._\n\n\n## Building the application with an LLM API and MCP\n\n\nIf your application is using an LLM API that supports MCP (like OpenAI), you can use the [`mcp-use`](https://github.com/mcp-use/mcp-use) Python package to connect to Unified MCP and access your customer's data and actions.\n\n\n### Dependencies\n\n\nThe full list of dependencies and setup you need to do to get things running.\n\n\n```bash\nmkdir unified-mcp-client\ncd unified-mcp-client\npython -m venv .venv\nsource .venv/bin/activate\npip install mcp-use python-dotenv requests openai\ntouch client.py\n",[109,28913,28914,28919,28924,28928,28932,28937,28941,28945,28950,28954,28958,28963,28967,28971,28976,28980,28984,28989,28993,28997,29002,29007,29012,29017,29022,29027],{"__ignoreMap":107},[112,28915,28916],{"class":114,"line":115},[112,28917,28918],{},"\u003Chttps://mcp-api.unified.to/mcp?token=>\u003CYOUR_API_KEY>&connection=\u003CCONNECTION_ID>\n",[112,28920,28921],{"class":114,"line":126},[112,28922,28923],{},"```\n",[112,28925,28926],{"class":114,"line":135},[112,28927,272],{"emptyLinePlaceholder":271},[112,28929,28930],{"class":114,"line":147},[112,28931,272],{"emptyLinePlaceholder":271},[112,28933,28934],{"class":114,"line":202},[112,28935,28936],{},"_Note: Do not expose this token publicly._\n",[112,28938,28939],{"class":114,"line":208},[112,28940,272],{"emptyLinePlaceholder":271},[112,28942,28943],{"class":114,"line":291},[112,28944,272],{"emptyLinePlaceholder":271},[112,28946,28947],{"class":114,"line":299},[112,28948,28949],{},"## Building the application with an LLM API and MCP\n",[112,28951,28952],{"class":114,"line":307},[112,28953,272],{"emptyLinePlaceholder":271},[112,28955,28956],{"class":114,"line":315},[112,28957,272],{"emptyLinePlaceholder":271},[112,28959,28960],{"class":114,"line":323},[112,28961,28962],{},"If your application is using an LLM API that supports MCP (like OpenAI), you can use the [`mcp-use`](https://github.com/mcp-use/mcp-use) Python package to connect to Unified MCP and access your customer's data and actions.\n",[112,28964,28965],{"class":114,"line":329},[112,28966,272],{"emptyLinePlaceholder":271},[112,28968,28969],{"class":114,"line":341},[112,28970,272],{"emptyLinePlaceholder":271},[112,28972,28973],{"class":114,"line":346},[112,28974,28975],{},"### Dependencies\n",[112,28977,28978],{"class":114,"line":366},[112,28979,272],{"emptyLinePlaceholder":271},[112,28981,28982],{"class":114,"line":381},[112,28983,272],{"emptyLinePlaceholder":271},[112,28985,28986],{"class":114,"line":387},[112,28987,28988],{},"The full list of dependencies and setup you need to do to get things running.\n",[112,28990,28991],{"class":114,"line":392},[112,28992,272],{"emptyLinePlaceholder":271},[112,28994,28995],{"class":114,"line":409},[112,28996,272],{"emptyLinePlaceholder":271},[112,28998,28999],{"class":114,"line":422},[112,29000,29001],{},"```bash\n",[112,29003,29004],{"class":114,"line":435},[112,29005,29006],{},"mkdir unified-mcp-client\n",[112,29008,29009],{"class":114,"line":440},[112,29010,29011],{},"cd unified-mcp-client\n",[112,29013,29014],{"class":114,"line":4949},[112,29015,29016],{},"python -m venv .venv\n",[112,29018,29019],{"class":114,"line":4960},[112,29020,29021],{},"source .venv/bin/activate\n",[112,29023,29024],{"class":114,"line":4972},[112,29025,29026],{},"pip install mcp-use python-dotenv requests openai\n",[112,29028,29029],{"class":114,"line":4984},[112,29030,29031],{},"touch client.py\n",[35,29033,29035],{"id":29034},"setting-up-your-secrets","Setting up your secrets",[19,29037,29038,29039,29041],{},"Add your Unified API key, your customer's connection ID, and your workspace secret to a ",[109,29040,170],{}," file:",[102,29043,29045],{"className":104,"code":29044,"language":106,"meta":107,"style":107},"echo \"UNIFIED_API_KEY=\u003Cyour Unified API key here>\" >> .env\necho \"CONNECTION_ID=\u003Cyour Unified connection ID here>\" >> .env\necho \".env\" >> .gitignore\n",[109,29046,29047,29061,29072],{"__ignoreMap":107},[112,29048,29049,29052,29055,29058],{"class":114,"line":115},[112,29050,29051],{"class":129},"echo",[112,29053,29054],{"class":122}," \"UNIFIED_API_KEY=\u003Cyour Unified API key here>\"",[112,29056,29057],{"class":229}," >>",[112,29059,29060],{"class":122}," .env\n",[112,29062,29063,29065,29068,29070],{"class":114,"line":126},[112,29064,29051],{"class":129},[112,29066,29067],{"class":122}," \"CONNECTION_ID=\u003Cyour Unified connection ID here>\"",[112,29069,29057],{"class":229},[112,29071,29060],{"class":122},[112,29073,29074,29076,29079,29081],{"class":114,"line":135},[112,29075,29051],{"class":129},[112,29077,29078],{"class":122}," \".env\"",[112,29080,29057],{"class":229},[112,29082,29083],{"class":122}," .gitignore\n",[12,29085,29087],{"id":29086},"the-mcp-client-class","The MCP Client Class",[19,29089,29090,29091,29094],{},"Here's an example using the ",[109,29092,29093],{},"mcp-use"," package:",[102,29096,29098],{"className":26082,"code":29097,"language":26084,"meta":107,"style":107},"# client.py\nimport os\nimport hashlib\nimport secrets\nfrom dotenv import load_dotenv\nfrom mcp_use import MCPClient\n\nload_dotenv()\n\nCONNECTION_ID = os.getenv(\"CONNECTION_ID\")\nTOKEN = os.getenv(\"API_KEY\")\n\nMCP_URL = f\"\u003Chttps://mcp-api.unified.to/mcp?token={TOKEN}&connection={CONNECTION_ID}>\"\n\nclient = MCPClient(MCP_URL)\n\n# List available tools\ntools = client.list_tools()\nprint(\"Available tools:\", [tool['id'] for tool in tools])\n\n# Call a tool (example: call the first tool with no arguments)\nif tools:\n    tool_id = tools[0]['id']\n    result = client.call_tool(tool_id, {})\n    print(\"Tool result:\", result)\n",[109,29099,29100,29105,29112,29119,29126,29138,29150,29154,29159,29163,29177,29191,29195,29220,29224,29238,29242,29247,29257,29286,29290,29295,29302,29321,29331],{"__ignoreMap":107},[112,29101,29102],{"class":114,"line":115},[112,29103,29104],{"class":578},"# client.py\n",[112,29106,29107,29109],{"class":114,"line":126},[112,29108,230],{"class":229},[112,29110,29111],{"class":236}," os\n",[112,29113,29114,29116],{"class":114,"line":135},[112,29115,230],{"class":229},[112,29117,29118],{"class":236}," hashlib\n",[112,29120,29121,29123],{"class":114,"line":147},[112,29122,230],{"class":229},[112,29124,29125],{"class":236}," secrets\n",[112,29127,29128,29130,29133,29135],{"class":114,"line":202},[112,29129,247],{"class":229},[112,29131,29132],{"class":236}," dotenv ",[112,29134,230],{"class":229},[112,29136,29137],{"class":236}," load_dotenv\n",[112,29139,29140,29142,29145,29147],{"class":114,"line":208},[112,29141,247],{"class":229},[112,29143,29144],{"class":236}," mcp_use ",[112,29146,230],{"class":229},[112,29148,29149],{"class":236}," MCPClient\n",[112,29151,29152],{"class":114,"line":291},[112,29153,272],{"emptyLinePlaceholder":271},[112,29155,29156],{"class":114,"line":299},[112,29157,29158],{"class":236},"load_dotenv()\n",[112,29160,29161],{"class":114,"line":307},[112,29162,272],{"emptyLinePlaceholder":271},[112,29164,29165,29167,29169,29172,29175],{"class":114,"line":315},[112,29166,17908],{"class":129},[112,29168,354],{"class":229},[112,29170,29171],{"class":236}," os.getenv(",[112,29173,29174],{"class":122},"\"CONNECTION_ID\"",[112,29176,15267],{"class":236},[112,29178,29179,29182,29184,29186,29189],{"class":114,"line":323},[112,29180,29181],{"class":129},"TOKEN",[112,29183,354],{"class":229},[112,29185,29171],{"class":236},[112,29187,29188],{"class":122},"\"API_KEY\"",[112,29190,15267],{"class":236},[112,29192,29193],{"class":114,"line":329},[112,29194,272],{"emptyLinePlaceholder":271},[112,29196,29197,29200,29202,29205,29208,29211,29214,29217],{"class":114,"line":341},[112,29198,29199],{"class":129},"MCP_URL",[112,29201,354],{"class":229},[112,29203,29204],{"class":229}," f",[112,29206,29207],{"class":122},"\"\u003Chttps://mcp-api.unified.to/mcp?token=",[112,29209,29210],{"class":129},"{TOKEN}",[112,29212,29213],{"class":122},"&connection=",[112,29215,29216],{"class":129},"{CONNECTION_ID}",[112,29218,29219],{"class":122},">\"\n",[112,29221,29222],{"class":114,"line":346},[112,29223,272],{"emptyLinePlaceholder":271},[112,29225,29226,29229,29231,29234,29236],{"class":114,"line":366},[112,29227,29228],{"class":236},"client ",[112,29230,335],{"class":229},[112,29232,29233],{"class":236}," MCPClient(",[112,29235,29199],{"class":129},[112,29237,15267],{"class":236},[112,29239,29240],{"class":114,"line":381},[112,29241,272],{"emptyLinePlaceholder":271},[112,29243,29244],{"class":114,"line":387},[112,29245,29246],{"class":578},"# List available tools\n",[112,29248,29249,29252,29254],{"class":114,"line":392},[112,29250,29251],{"class":236},"tools ",[112,29253,335],{"class":229},[112,29255,29256],{"class":236}," client.list_tools()\n",[112,29258,29259,29262,29264,29267,29270,29272,29275,29277,29280,29283],{"class":114,"line":409},[112,29260,29261],{"class":129},"print",[112,29263,456],{"class":236},[112,29265,29266],{"class":122},"\"Available tools:\"",[112,29268,29269],{"class":236},", [tool[",[112,29271,17321],{"class":122},[112,29273,29274],{"class":236},"] ",[112,29276,27581],{"class":229},[112,29278,29279],{"class":236}," tool ",[112,29281,29282],{"class":229},"in",[112,29284,29285],{"class":236}," tools])\n",[112,29287,29288],{"class":114,"line":422},[112,29289,272],{"emptyLinePlaceholder":271},[112,29291,29292],{"class":114,"line":435},[112,29293,29294],{"class":578},"# Call a tool (example: call the first tool with no arguments)\n",[112,29296,29297,29299],{"class":114,"line":440},[112,29298,26505],{"class":229},[112,29300,29301],{"class":236}," tools:\n",[112,29303,29304,29307,29309,29312,29314,29317,29319],{"class":114,"line":4949},[112,29305,29306],{"class":236},"    tool_id ",[112,29308,335],{"class":229},[112,29310,29311],{"class":236}," tools[",[112,29313,660],{"class":129},[112,29315,29316],{"class":236},"][",[112,29318,17321],{"class":122},[112,29320,2794],{"class":236},[112,29322,29323,29326,29328],{"class":114,"line":4960},[112,29324,29325],{"class":236},"    result ",[112,29327,335],{"class":229},[112,29329,29330],{"class":236}," client.call_tool(tool_id, {})\n",[112,29332,29333,29336,29338,29341],{"class":114,"line":4972},[112,29334,29335],{"class":129},"    print",[112,29337,456],{"class":236},[112,29339,29340],{"class":122},"\"Tool result:\"",[112,29342,29343],{"class":236},", result)\n",[67,29345,29347],{"id":29346},"integrating-with-openai-llm-api","Integrating with OpenAI (LLM API)",[19,29349,29350],{},"Once your MCP client is set up, you can connect it to OpenAI's API, which natively supports remote MCP servers.",[35,29352,29354],{"id":29353},"configure-openai-to-use-unified-mcp","Configure OpenAI to Use Unified MCP",[19,29356,29357],{},"When you send a chat completion request, specify the MCP server as a tool source.",[19,29359,29360,29361,171],{},"Here's a ",[478,29362,29363],{},"candidate assessment example",[102,29365,29367],{"className":26082,"code":29366,"language":26084,"meta":107,"style":107},"import openai\n\nopenai.api_key = os.getenv(\"OPENAI_API_KEY\")\n\nresponse = openai.chat.completions.create(\n    model=\"gpt-4o\",\n    messages=[\n        {\"role\": \"user\", \"content\": \"Score this candidate for the Software Engineer job.\"}\n    ],\n    tools=[{\n        \"type\": \"mcp\",\n        \"url\": MCP_URL,  # The Unified MCP URL with your token\n    }],\n    tool_choice=\"auto\"\n)\n\nprint(response.choices[0].message.content)\n",[109,29368,29369,29375,29379,29393,29397,29406,29417,29426,29450,29454,29463,29475,29490,29495,29505,29509,29513],{"__ignoreMap":107},[112,29370,29371,29373],{"class":114,"line":115},[112,29372,230],{"class":229},[112,29374,164],{"class":236},[112,29376,29377],{"class":114,"line":126},[112,29378,272],{"emptyLinePlaceholder":271},[112,29380,29381,29384,29386,29388,29391],{"class":114,"line":135},[112,29382,29383],{"class":236},"openai.api_key ",[112,29385,335],{"class":229},[112,29387,29171],{"class":236},[112,29389,29390],{"class":122},"\"OPENAI_API_KEY\"",[112,29392,15267],{"class":236},[112,29394,29395],{"class":114,"line":147},[112,29396,272],{"emptyLinePlaceholder":271},[112,29398,29399,29401,29403],{"class":114,"line":202},[112,29400,27079],{"class":236},[112,29402,335],{"class":229},[112,29404,29405],{"class":236}," openai.chat.completions.create(\n",[112,29407,29408,29410,29412,29415],{"class":114,"line":208},[112,29409,26101],{"class":517},[112,29411,335],{"class":229},[112,29413,29414],{"class":122},"\"gpt-4o\"",[112,29416,288],{"class":236},[112,29418,29419,29422,29424],{"class":114,"line":291},[112,29420,29421],{"class":517},"    messages",[112,29423,335],{"class":229},[112,29425,2728],{"class":236},[112,29427,29428,29431,29434,29436,29438,29440,29443,29445,29448],{"class":114,"line":299},[112,29429,29430],{"class":236},"        {",[112,29432,29433],{"class":122},"\"role\"",[112,29435,2335],{"class":236},[112,29437,27950],{"class":122},[112,29439,1046],{"class":236},[112,29441,29442],{"class":122},"\"content\"",[112,29444,2335],{"class":236},[112,29446,29447],{"class":122},"\"Score this candidate for the Software Engineer job.\"",[112,29449,584],{"class":236},[112,29451,29452],{"class":114,"line":307},[112,29453,9155],{"class":236},[112,29455,29456,29458,29460],{"class":114,"line":315},[112,29457,26113],{"class":517},[112,29459,335],{"class":229},[112,29461,29462],{"class":236},"[{\n",[112,29464,29465,29468,29470,29473],{"class":114,"line":323},[112,29466,29467],{"class":122},"        \"type\"",[112,29469,2335],{"class":236},[112,29471,29472],{"class":122},"\"mcp\"",[112,29474,288],{"class":236},[112,29476,29477,29480,29482,29484,29487],{"class":114,"line":329},[112,29478,29479],{"class":122},"        \"url\"",[112,29481,2335],{"class":236},[112,29483,29199],{"class":129},[112,29485,29486],{"class":236},",  ",[112,29488,29489],{"class":578},"# The Unified MCP URL with your token\n",[112,29491,29492],{"class":114,"line":341},[112,29493,29494],{"class":236},"    }],\n",[112,29496,29497,29500,29502],{"class":114,"line":346},[112,29498,29499],{"class":517},"    tool_choice",[112,29501,335],{"class":229},[112,29503,29504],{"class":122},"\"auto\"\n",[112,29506,29507],{"class":114,"line":366},[112,29508,15267],{"class":236},[112,29510,29511],{"class":114,"line":381},[112,29512,272],{"emptyLinePlaceholder":271},[112,29514,29515,29517,29520,29522],{"class":114,"line":387},[112,29516,29261],{"class":129},[112,29518,29519],{"class":236},"(response.choices[",[112,29521,660],{"class":129},[112,29523,29524],{"class":236},"].message.content)\n",[19,29526,29527],{},[478,29528,29529],{},"No backend glue code required—OpenAI orchestrates the tool calls via Unified MCP.",[67,29531,26065],{"id":26064},[19,29533,29534],{},[478,29535,26070],{},[43,29537,29538,29586,29654,29658],{},[46,29539,26075,29540,26079,29542],{},[109,29541,26078],{},[102,29543,29544],{"className":26082,"code":26083,"language":26084,"meta":107,"style":107},[109,29545,29546,29554,29564,29572,29582],{"__ignoreMap":107},[112,29547,29548,29550,29552],{"class":114,"line":115},[112,29549,26091],{"class":236},[112,29551,335],{"class":229},[112,29553,26096],{"class":236},[112,29555,29556,29558,29560,29562],{"class":114,"line":126},[112,29557,26101],{"class":517},[112,29559,335],{"class":229},[112,29561,26106],{"class":122},[112,29563,288],{"class":236},[112,29565,29566,29568,29570],{"class":114,"line":135},[112,29567,26113],{"class":517},[112,29569,335],{"class":229},[112,29571,26118],{"class":236},[112,29573,29574,29576,29578,29580],{"class":114,"line":147},[112,29575,26123],{"class":517},[112,29577,335],{"class":229},[112,29579,26128],{"class":122},[112,29581,288],{"class":236},[112,29583,29584],{"class":114,"line":202},[112,29585,15267],{"class":236},[46,29587,26137,29588,26141,29590],{},[109,29589,26140],{},[102,29591,29592],{"className":2318,"code":26144,"language":2320,"meta":107,"style":107},[109,29593,29594,29598,29602,29612,29622,29632,29646,29650],{"__ignoreMap":107},[112,29595,29596],{"class":114,"line":115},[112,29597,2728],{"class":236},[112,29599,29600],{"class":114,"line":126},[112,29601,26155],{"class":236},[112,29603,29604,29606,29608,29610],{"class":114,"line":135},[112,29605,26160],{"class":129},[112,29607,2335],{"class":236},[112,29609,26165],{"class":122},[112,29611,288],{"class":236},[112,29613,29614,29616,29618,29620],{"class":114,"line":147},[112,29615,26172],{"class":129},[112,29617,2335],{"class":236},[112,29619,26177],{"class":122},[112,29621,288],{"class":236},[112,29623,29624,29626,29628,29630],{"class":114,"line":202},[112,29625,26184],{"class":129},[112,29627,2335],{"class":236},[112,29629,26189],{"class":122},[112,29631,288],{"class":236},[112,29633,29634,29636,29638,29640,29642,29644],{"class":114,"line":208},[112,29635,26196],{"class":129},[112,29637,26199],{"class":236},[112,29639,26202],{"class":129},[112,29641,2335],{"class":236},[112,29643,26207],{"class":122},[112,29645,2398],{"class":236},[112,29647,29648],{"class":114,"line":291},[112,29649,1476],{"class":236},[112,29651,29652],{"class":114,"line":299},[112,29653,2794],{"class":236},[46,29655,26075,29656,26223],{},[109,29657,26222],{},[46,29659,26226,29660,26230,29662],{},[109,29661,26229],{},[102,29663,29664],{"className":2318,"code":26233,"language":2320,"meta":107,"style":107},[109,29665,29666,29670,29674,29684,29694,29702,29706],{"__ignoreMap":107},[112,29667,29668],{"class":114,"line":115},[112,29669,2728],{"class":236},[112,29671,29672],{"class":114,"line":126},[112,29673,26155],{"class":236},[112,29675,29676,29678,29680,29682],{"class":114,"line":135},[112,29677,26160],{"class":129},[112,29679,2335],{"class":236},[112,29681,26252],{"class":122},[112,29683,288],{"class":236},[112,29685,29686,29688,29690,29692],{"class":114,"line":147},[112,29687,26259],{"class":129},[112,29689,2335],{"class":236},[112,29691,26177],{"class":122},[112,29693,288],{"class":236},[112,29695,29696,29698,29700],{"class":114,"line":202},[112,29697,26270],{"class":129},[112,29699,2335],{"class":236},[112,29701,26275],{"class":122},[112,29703,29704],{"class":114,"line":208},[112,29705,1476],{"class":236},[112,29707,29708],{"class":114,"line":291},[112,29709,2794],{"class":236},[67,29711,27878],{"id":27877},[19,29713,29714],{},[478,29715,26070],{},[43,29717,29718,29724,29746,29750],{},[46,29719,26075,29720,27889,29722,27893],{},[109,29721,26078],{},[109,29723,27892],{},[46,29725,27896,29726],{},[102,29727,29728],{"className":174,"code":27899,"language":176,"meta":177,"style":107},[109,29729,29730,29734,29738,29742],{"__ignoreMap":107},[112,29731,29732],{"class":114,"line":115},[112,29733,27906],{},[112,29735,29736],{"class":114,"line":126},[112,29737,27911],{},[112,29739,29740],{"class":114,"line":135},[112,29741,27916],{},[112,29743,29744],{"class":114,"line":147},[112,29745,584],{},[46,29747,26075,29748,27120],{},[109,29749,26222],{},[46,29751,27927,29752,27931,29754],{},[109,29753,27930],{},[102,29755,29756],{"className":2318,"code":27934,"language":2320,"meta":107,"style":107},[109,29757,29758,29762,29772,29778,29782,29788,29798,29808,29812,29816,29820],{"__ignoreMap":107},[112,29759,29760],{"class":114,"line":115},[112,29761,2327],{"class":236},[112,29763,29764,29766,29768,29770],{"class":114,"line":126},[112,29765,27945],{"class":129},[112,29767,2335],{"class":236},[112,29769,27950],{"class":122},[112,29771,288],{"class":236},[112,29773,29774,29776],{"class":114,"line":135},[112,29775,27957],{"class":129},[112,29777,2372],{"class":236},[112,29779,29780],{"class":114,"line":147},[112,29781,1076],{"class":236},[112,29783,29784,29786],{"class":114,"line":202},[112,29785,27968],{"class":129},[112,29787,3888],{"class":236},[112,29789,29790,29792,29794,29796],{"class":114,"line":208},[112,29791,27975],{"class":129},[112,29793,2335],{"class":236},[112,29795,26189],{"class":122},[112,29797,288],{"class":236},[112,29799,29800,29802,29804,29806],{"class":114,"line":291},[112,29801,27986],{"class":129},[112,29803,26199],{"class":236},[112,29805,14552],{"class":2885},[112,29807,2398],{"class":236},[112,29809,29810],{"class":114,"line":299},[112,29811,17649],{"class":236},[112,29813,29814],{"class":114,"line":307},[112,29815,3946],{"class":236},[112,29817,29818],{"class":114,"line":315},[112,29819,2403],{"class":236},[112,29821,29822],{"class":114,"line":323},[112,29823,584],{"class":236},[67,29825,29827],{"id":29826},"integrating-with-cohere","Integrating with Cohere",[19,29829,29830],{},[478,29831,26070],{},[43,29833,29834,29876,29880],{},[46,29835,26075,29836,27069,29838],{},[109,29837,27068],{},[102,29839,29840],{"className":26082,"code":27072,"language":26084,"meta":107,"style":107},[109,29841,29842,29850,29872],{"__ignoreMap":107},[112,29843,29844,29846,29848],{"class":114,"line":115},[112,29845,27079],{"class":236},[112,29847,335],{"class":229},[112,29849,27084],{"class":236},[112,29851,29852,29854,29856,29858,29860,29862,29864,29866,29868,29870],{"class":114,"line":126},[112,29853,26101],{"class":517},[112,29855,335],{"class":229},[112,29857,27093],{"class":122},[112,29859,1046],{"class":236},[112,29861,27098],{"class":517},[112,29863,335],{"class":229},[112,29865,27103],{"class":236},[112,29867,26303],{"class":517},[112,29869,335],{"class":229},[112,29871,27110],{"class":236},[112,29873,29874],{"class":114,"line":135},[112,29875,15267],{"class":236},[46,29877,27117,29878,27120],{},[109,29879,26222],{},[46,29881,27123],{},[35,29883,27127],{"id":27126},[19,29885,29886],{},[478,29887,27132],{},[102,29889,29890],{"className":174,"code":27135,"language":176,"meta":177,"style":107},[109,29891,29892],{"__ignoreMap":107},[112,29893,29894],{"class":114,"line":115},[112,29895,27135],{},[19,29897,29898],{},[478,29899,27146],{},[72,29901,29902,29911,29918,29922],{},[46,29903,29904,29905,1046,29907,1046,29909,772],{},"Your chosen LLM discovers the available tools from Unified MCP (e.g., ",[109,29906,27154],{},[109,29908,27157],{},[109,29910,27160],{},[46,29912,29913,29914,11338,29916,27168],{},"The LLM calls ",[109,29915,27154],{},[109,29917,27157],{},[46,29919,29913,29920,27173],{},[109,29921,27160],{},[46,29923,29924],{},"The LLM returns a response like:",[19,29926,29927],{},[478,29928,2718],{},[102,29930,29931],{"className":174,"code":27183,"language":176,"meta":177,"style":107},[109,29932,29933],{"__ignoreMap":107},[112,29934,29935],{"class":114,"line":115},[112,29936,27183],{},[1558,29938,29939],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}",{"title":107,"searchDepth":126,"depth":126,"links":29941},[29942,29943,29946,29949,29950,29951],{"id":28859,"depth":126,"text":28860},{"id":26020,"depth":126,"text":26021,"children":29944},[29945],{"id":29034,"depth":135,"text":29035},{"id":29346,"depth":126,"text":29347,"children":29947},[29948],{"id":29353,"depth":135,"text":29354},{"id":26064,"depth":126,"text":26065},{"id":27877,"depth":126,"text":27878},{"id":29826,"depth":126,"text":29827,"children":29952},[29953],{"id":27126,"depth":135,"text":27127},"Unified's MCP server allows your application to give an LLM API real-time access to your customers' SaaS data and perform actions on that data — without you...",{"img":29956,"date":29957,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server-icon.png","2025-08-25T00:00:00.000Z","/guides/how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server",{"title":28827,"description":29954},"guides/how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server","wXJy6qyw23JX2up9jKGlMjTPCMTzv1uN0GG77H2A-44",{"id":29963,"title":29964,"body":29965,"description":30787,"extension":1576,"meta":30788,"navigation":271,"path":30790,"seo":30791,"stem":30792,"__hash__":30793},"guides/guides/how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect OpenAI to Real-Time SaaS Data with Unified.to MCP Server",{"type":9,"value":29966,"toc":30777},[29967,29970,29972,29976,29981,29984,29987,29989,29995,29997,30015,30017,30019,30021,30023,30027,30167,30169,30171,30174,30197,30200,30202,30723,30725,30727,30749,30752,30756,30768,30774],[12,29968,29964],{"id":29969},"how-to-connect-openai-to-real-time-saas-data-with-unifiedto-mcp-server",[16,29971],{},[19,29973,29974],{},[22,29975,26008],{},[19,29977,29978,29979,27832],{},"OpenAI's LLMs can power rich workflows — but most products still need access to ",[478,29980,27831],{},[19,29982,29983],{},"With Unified.to's MCP server, you can skip that complexity. Unified.to exposes 317+ SaaS integrations as real-time, callable tools that OpenAI can use directly — no custom integration logic required.",[19,29985,29986],{},"In this guide, we'll walk through how to connect OpenAI to Unified.to MCP so your application can give OpenAI real-time access to customer SaaS data and actions.",[67,29988,26021],{"id":26020},[19,29990,26024,29991,26028,29993,26032],{},[109,29992,26027],{},[109,29994,26031],{},[19,29996,26035],{},[72,29998,29999,30007],{},[46,30000,30001,30003,26045,30005,26049],{},[478,30002,26042],{},[17180,30004],{},[109,30006,26048],{},[46,30008,30009,30011,26057,30013,26061],{},[478,30010,26054],{},[17180,30012],{},[109,30014,26060],{},[67,30016,29347],{"id":29346},[19,30018,29350],{},[35,30020,29354],{"id":29353},[19,30022,29357],{},[19,30024,29360,30025,171],{},[478,30026,29363],{},[102,30028,30029],{"className":26082,"code":29366,"language":26084,"meta":107,"style":107},[109,30030,30031,30037,30041,30053,30057,30065,30075,30083,30103,30107,30115,30125,30137,30141,30149,30153,30157],{"__ignoreMap":107},[112,30032,30033,30035],{"class":114,"line":115},[112,30034,230],{"class":229},[112,30036,164],{"class":236},[112,30038,30039],{"class":114,"line":126},[112,30040,272],{"emptyLinePlaceholder":271},[112,30042,30043,30045,30047,30049,30051],{"class":114,"line":135},[112,30044,29383],{"class":236},[112,30046,335],{"class":229},[112,30048,29171],{"class":236},[112,30050,29390],{"class":122},[112,30052,15267],{"class":236},[112,30054,30055],{"class":114,"line":147},[112,30056,272],{"emptyLinePlaceholder":271},[112,30058,30059,30061,30063],{"class":114,"line":202},[112,30060,27079],{"class":236},[112,30062,335],{"class":229},[112,30064,29405],{"class":236},[112,30066,30067,30069,30071,30073],{"class":114,"line":208},[112,30068,26101],{"class":517},[112,30070,335],{"class":229},[112,30072,29414],{"class":122},[112,30074,288],{"class":236},[112,30076,30077,30079,30081],{"class":114,"line":291},[112,30078,29421],{"class":517},[112,30080,335],{"class":229},[112,30082,2728],{"class":236},[112,30084,30085,30087,30089,30091,30093,30095,30097,30099,30101],{"class":114,"line":299},[112,30086,29430],{"class":236},[112,30088,29433],{"class":122},[112,30090,2335],{"class":236},[112,30092,27950],{"class":122},[112,30094,1046],{"class":236},[112,30096,29442],{"class":122},[112,30098,2335],{"class":236},[112,30100,29447],{"class":122},[112,30102,584],{"class":236},[112,30104,30105],{"class":114,"line":307},[112,30106,9155],{"class":236},[112,30108,30109,30111,30113],{"class":114,"line":315},[112,30110,26113],{"class":517},[112,30112,335],{"class":229},[112,30114,29462],{"class":236},[112,30116,30117,30119,30121,30123],{"class":114,"line":323},[112,30118,29467],{"class":122},[112,30120,2335],{"class":236},[112,30122,29472],{"class":122},[112,30124,288],{"class":236},[112,30126,30127,30129,30131,30133,30135],{"class":114,"line":329},[112,30128,29479],{"class":122},[112,30130,2335],{"class":236},[112,30132,29199],{"class":129},[112,30134,29486],{"class":236},[112,30136,29489],{"class":578},[112,30138,30139],{"class":114,"line":341},[112,30140,29494],{"class":236},[112,30142,30143,30145,30147],{"class":114,"line":346},[112,30144,29499],{"class":517},[112,30146,335],{"class":229},[112,30148,29504],{"class":122},[112,30150,30151],{"class":114,"line":366},[112,30152,15267],{"class":236},[112,30154,30155],{"class":114,"line":381},[112,30156,272],{"emptyLinePlaceholder":271},[112,30158,30159,30161,30163,30165],{"class":114,"line":387},[112,30160,29261],{"class":129},[112,30162,29519],{"class":236},[112,30164,660],{"class":129},[112,30166,29524],{"class":236},[19,30168,29529],{},[67,30170,27193],{"id":27192},[19,30172,30173],{},"Unified.to MCP gives you granular control over how tools are exposed to OpenAI:",[72,30175,30176,30180,30184,30189,30193],{},[46,30177,30178,26298],{},[109,30179,26297],{},[46,30181,30182,26304],{},[109,30183,26303],{},[46,30185,30186,30188],{},[109,30187,26309],{}," → add synonyms so OpenAI better matches tool names.",[46,30190,30191,26316],{},[109,30192,26315],{},[46,30194,30195,26322],{},[109,30196,26321],{},[19,30198,30199],{},"These options help you keep OpenAI outputs predictable and secure in production-grade workflows.",[35,30201,26329],{"id":26328},[102,30203,30205],{"className":9951,"code":30204,"language":9953,"meta":107,"style":107},"import OpenAI from 'openai';\n\nimport Anthropic from '@anthropic-ai/sdk';\n// OpenAI model version\nconst modelVersion = 'latest';\n// Unified connection Id that you want to have the mcp to use tools for\nconst connection = 'UNIFIED_CONNECTION_ID';\n // location from where your unified account was created\nconst dc = 'us';\n// Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\n\nconst openai = new OpenAI({\n    apiKey: process.env.OPENAI_API_KEY || '',\n});\nconst params = new URLSearchParams({\n    token: process.env.UNIFIED_API_KEY || '',\n    type: 'openai',\n    dc,\n    connection,\n    include_external_tools: includeExternal ? 'true' : 'false',\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst serverUrl = `${process.env.UNIFIED_MCP_URL}/sse?${params.toString()}`;\n\n\nlet latestModel;\nif (modelVersion === 'latest') {\n    // get the latest model from open ai\n    const models = await openai.models.list();\n    latestModel = models.data[0].id;\n} else {\n    latestModel = modelVersion;\n}\n\nconst completion = await openai.responses.create({\n    model: latestModel,\n    tools: [\n        {\n            type: 'mcp',\n            server_label: 'unifiedMCP',\n            server_url: serverUrl, // change url as needed\n            require_approval: 'never',\n        },\n    ],\n    instructions: `You are a helpful assistant`,\n    input: message,\n});\n\nfor await (const chunk of completion.output) {\n    console.log('chunk', chunk);\n    console.log(JSON.stringify(chunk, null, 2));\n}\n",[109,30206,30207,30221,30225,30237,30242,30254,30258,30270,30274,30286,30290,30308,30312,30327,30339,30343,30357,30369,30378,30382,30386,30400,30404,30408,30422,30442,30446,30450,30484,30488,30492,30498,30510,30515,30532,30544,30552,30560,30564,30568,30585,30589,30594,30598,30607,30616,30623,30633,30637,30641,30651,30656,30660,30664,30681,30695,30719],{"__ignoreMap":107},[112,30208,30209,30211,30214,30216,30219],{"class":114,"line":115},[112,30210,230],{"class":229},[112,30212,30213],{"class":236}," OpenAI ",[112,30215,247],{"class":229},[112,30217,30218],{"class":122}," 'openai'",[112,30220,237],{"class":236},[112,30222,30223],{"class":114,"line":126},[112,30224,272],{"emptyLinePlaceholder":271},[112,30226,30227,30229,30231,30233,30235],{"class":114,"line":135},[112,30228,230],{"class":229},[112,30230,26341],{"class":236},[112,30232,247],{"class":229},[112,30234,26346],{"class":122},[112,30236,237],{"class":236},[112,30238,30239],{"class":114,"line":147},[112,30240,30241],{"class":578},"// OpenAI model version\n",[112,30243,30244,30246,30248,30250,30252],{"class":114,"line":202},[112,30245,277],{"class":229},[112,30247,26360],{"class":129},[112,30249,354],{"class":229},[112,30251,26365],{"class":122},[112,30253,237],{"class":236},[112,30255,30256],{"class":114,"line":208},[112,30257,26372],{"class":578},[112,30259,30260,30262,30264,30266,30268],{"class":114,"line":291},[112,30261,277],{"class":229},[112,30263,26379],{"class":129},[112,30265,354],{"class":229},[112,30267,26384],{"class":122},[112,30269,237],{"class":236},[112,30271,30272],{"class":114,"line":299},[112,30273,26391],{"class":578},[112,30275,30276,30278,30280,30282,30284],{"class":114,"line":307},[112,30277,277],{"class":229},[112,30279,26398],{"class":129},[112,30281,354],{"class":229},[112,30283,26403],{"class":122},[112,30285,237],{"class":236},[112,30287,30288],{"class":114,"line":315},[112,30289,26410],{"class":578},[112,30291,30292,30294,30296,30298,30300,30302,30304,30306],{"class":114,"line":323},[112,30293,277],{"class":229},[112,30295,26417],{"class":129},[112,30297,354],{"class":229},[112,30299,26422],{"class":236},[112,30301,26425],{"class":122},[112,30303,4877],{"class":236},[112,30305,26430],{"class":122},[112,30307,2794],{"class":236},[112,30309,30310],{"class":114,"line":329},[112,30311,272],{"emptyLinePlaceholder":271},[112,30313,30314,30316,30318,30320,30322,30325],{"class":114,"line":341},[112,30315,277],{"class":229},[112,30317,24254],{"class":129},[112,30319,354],{"class":229},[112,30321,357],{"class":229},[112,30323,30324],{"class":118}," OpenAI",[112,30326,363],{"class":236},[112,30328,30329,30331,30333,30335,30337],{"class":114,"line":346},[112,30330,19714],{"class":236},[112,30332,24275],{"class":129},[112,30334,669],{"class":229},[112,30336,26463],{"class":122},[112,30338,288],{"class":236},[112,30340,30341],{"class":114,"line":366},[112,30342,384],{"class":236},[112,30344,30345,30347,30349,30351,30353,30355],{"class":114,"line":381},[112,30346,277],{"class":229},[112,30348,26443],{"class":129},[112,30350,354],{"class":229},[112,30352,357],{"class":229},[112,30354,17299],{"class":118},[112,30356,363],{"class":236},[112,30358,30359,30361,30363,30365,30367],{"class":114,"line":387},[112,30360,26456],{"class":236},[112,30362,372],{"class":129},[112,30364,669],{"class":229},[112,30366,26463],{"class":122},[112,30368,288],{"class":236},[112,30370,30371,30373,30376],{"class":114,"line":392},[112,30372,18413],{"class":236},[112,30374,30375],{"class":122},"'openai'",[112,30377,288],{"class":236},[112,30379,30380],{"class":114,"line":409},[112,30381,26475],{"class":236},[112,30383,30384],{"class":114,"line":422},[112,30385,26470],{"class":236},[112,30387,30388,30390,30392,30394,30396,30398],{"class":114,"line":435},[112,30389,26480],{"class":236},[112,30391,4711],{"class":229},[112,30393,26485],{"class":122},[112,30395,25896],{"class":229},[112,30397,26490],{"class":122},[112,30399,288],{"class":236},[112,30401,30402],{"class":114,"line":440},[112,30403,384],{"class":236},[112,30405,30406],{"class":114,"line":4949},[112,30407,272],{"emptyLinePlaceholder":271},[112,30409,30410,30412,30414,30416,30418,30420],{"class":114,"line":4960},[112,30411,26505],{"class":229},[112,30413,26508],{"class":236},[112,30415,14591],{"class":129},[112,30417,26513],{"class":229},[112,30419,14450],{"class":129},[112,30421,526],{"class":236},[112,30423,30424,30426,30428,30430,30432,30434,30436,30438,30440],{"class":114,"line":4972},[112,30425,26522],{"class":236},[112,30427,26525],{"class":118},[112,30429,456],{"class":236},[112,30431,26530],{"class":122},[112,30433,26533],{"class":236},[112,30435,775],{"class":118},[112,30437,456],{"class":236},[112,30439,26540],{"class":122},[112,30441,24808],{"class":236},[112,30443,30444],{"class":114,"line":4984},[112,30445,584],{"class":236},[112,30447,30448],{"class":114,"line":4992},[112,30449,272],{"emptyLinePlaceholder":271},[112,30451,30452,30454,30456,30458,30460,30462,30464,30466,30468,30470,30472,30474,30476,30478,30480,30482],{"class":114,"line":5000},[112,30453,277],{"class":229},[112,30455,26590],{"class":129},[112,30457,354],{"class":229},[112,30459,751],{"class":122},[112,30461,26597],{"class":236},[112,30463,634],{"class":122},[112,30465,26602],{"class":236},[112,30467,634],{"class":122},[112,30469,26607],{"class":129},[112,30471,26610],{"class":122},[112,30473,26613],{"class":236},[112,30475,634],{"class":122},[112,30477,13776],{"class":118},[112,30479,26620],{"class":122},[112,30481,640],{"class":122},[112,30483,237],{"class":236},[112,30485,30486],{"class":114,"line":5008},[112,30487,272],{"emptyLinePlaceholder":271},[112,30489,30490],{"class":114,"line":5016},[112,30491,272],{"emptyLinePlaceholder":271},[112,30493,30494,30496],{"class":114,"line":5024},[112,30495,26633],{"class":229},[112,30497,26636],{"class":236},[112,30499,30500,30502,30504,30506,30508],{"class":114,"line":5032},[112,30501,26505],{"class":229},[112,30503,26647],{"class":236},[112,30505,14573],{"class":229},[112,30507,26365],{"class":122},[112,30509,526],{"class":236},[112,30511,30512],{"class":114,"line":5040},[112,30513,30514],{"class":578},"    // get the latest model from open ai\n",[112,30516,30517,30519,30521,30523,30525,30528,30530],{"class":114,"line":5046},[112,30518,1435],{"class":229},[112,30520,26665],{"class":129},[112,30522,354],{"class":229},[112,30524,539],{"class":229},[112,30526,30527],{"class":236}," openai.models.",[112,30529,26675],{"class":118},[112,30531,1536],{"class":236},[112,30533,30534,30536,30538,30540,30542],{"class":114,"line":5052},[112,30535,26682],{"class":236},[112,30537,335],{"class":229},[112,30539,26687],{"class":236},[112,30541,660],{"class":129},[112,30543,26692],{"class":236},[112,30545,30546,30548,30550],{"class":114,"line":5061},[112,30547,332],{"class":236},[112,30549,14616],{"class":229},[112,30551,280],{"class":236},[112,30553,30554,30556,30558],{"class":114,"line":5066},[112,30555,26682],{"class":236},[112,30557,335],{"class":229},[112,30559,26709],{"class":236},[112,30561,30562],{"class":114,"line":9217},[112,30563,584],{"class":236},[112,30565,30566],{"class":114,"line":9225},[112,30567,272],{"emptyLinePlaceholder":271},[112,30569,30570,30572,30574,30576,30578,30581,30583],{"class":114,"line":9237},[112,30571,277],{"class":229},[112,30573,26724],{"class":129},[112,30575,354],{"class":229},[112,30577,539],{"class":229},[112,30579,30580],{"class":236}," openai.responses.",[112,30582,18060],{"class":118},[112,30584,363],{"class":236},[112,30586,30587],{"class":114,"line":9248},[112,30588,26740],{"class":236},[112,30590,30591],{"class":114,"line":9253},[112,30592,30593],{"class":236},"    tools: [\n",[112,30595,30596],{"class":114,"line":9261},[112,30597,4001],{"class":236},[112,30599,30600,30602,30605],{"class":114,"line":9267},[112,30601,26803],{"class":236},[112,30603,30604],{"class":122},"'mcp'",[112,30606,288],{"class":236},[112,30608,30609,30612,30614],{"class":114,"line":9272},[112,30610,30611],{"class":236},"            server_label: ",[112,30613,26851],{"class":122},[112,30615,288],{"class":236},[112,30617,30618,30621],{"class":114,"line":9280},[112,30619,30620],{"class":236},"            server_url: serverUrl, ",[112,30622,26843],{"class":578},[112,30624,30625,30628,30631],{"class":114,"line":9293},[112,30626,30627],{"class":236},"            require_approval: ",[112,30629,30630],{"class":122},"'never'",[112,30632,288],{"class":236},[112,30634,30635],{"class":114,"line":9304},[112,30636,4803],{"class":236},[112,30638,30639],{"class":114,"line":9309},[112,30640,9155],{"class":236},[112,30642,30643,30646,30649],{"class":114,"line":9317},[112,30644,30645],{"class":236},"    instructions: ",[112,30647,30648],{"class":122},"`You are a helpful assistant`",[112,30650,288],{"class":236},[112,30652,30653],{"class":114,"line":9328},[112,30654,30655],{"class":236},"    input: message,\n",[112,30657,30658],{"class":114,"line":9337},[112,30659,384],{"class":236},[112,30661,30662],{"class":114,"line":9342},[112,30663,272],{"emptyLinePlaceholder":271},[112,30665,30666,30668,30670,30672,30674,30676,30678],{"class":114,"line":9350},[112,30667,27581],{"class":229},[112,30669,539],{"class":229},[112,30671,1419],{"class":236},[112,30673,277],{"class":229},[112,30675,28664],{"class":129},[112,30677,1427],{"class":229},[112,30679,30680],{"class":236}," completion.output) {\n",[112,30682,30683,30685,30687,30689,30692],{"class":114,"line":9361},[112,30684,17339],{"class":236},[112,30686,1512],{"class":118},[112,30688,456],{"class":236},[112,30690,30691],{"class":122},"'chunk'",[112,30693,30694],{"class":236},", chunk);\n",[112,30696,30697,30699,30701,30703,30705,30707,30709,30711,30713,30715,30717],{"class":114,"line":9371},[112,30698,17339],{"class":236},[112,30700,1512],{"class":118},[112,30702,456],{"class":236},[112,30704,13765],{"class":129},[112,30706,634],{"class":236},[112,30708,13770],{"class":118},[112,30710,28690],{"class":236},[112,30712,26905],{"class":129},[112,30714,1046],{"class":236},[112,30716,26910],{"class":129},[112,30718,24808],{"class":236},[112,30720,30721],{"class":114,"line":9376},[112,30722,584],{"class":236},[67,30724,26916],{"id":26915},[19,30726,27740],{},[72,30728,30729,30733,30737,30741,30745],{},[46,30730,30731,26927],{},[478,30732,26926],{},[46,30734,30735,26933],{},[478,30736,26932],{},[46,30738,30739,26939],{},[478,30740,26938],{},[46,30742,30743,26945],{},[478,30744,26944],{},[46,30746,30747,26951],{},[478,30748,26950],{},[19,30750,30751],{},"This ensures your OpenAI workflows aren't just demos — they're secure, scalable, and designed for production-grade use cases.",[19,30753,26954,30754,26958],{},[478,30755,26957],{},[72,30757,30758,30763],{},[46,30759,30760],{},[1614,30761,26965],{"href":26963,"rel":30762},[1618],[46,30764,30765],{},[1614,30766,28800],{"href":27781,"rel":30767},[1618],[10506,30769,30770],{},[19,30771,30772],{},[22,30773,26976],{},[1558,30775,30776],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":107,"searchDepth":126,"depth":126,"links":30778},[30779,30780,30783,30786],{"id":26020,"depth":126,"text":26021},{"id":29346,"depth":126,"text":29347,"children":30781},[30782],{"id":29353,"depth":135,"text":29354},{"id":27192,"depth":126,"text":27193,"children":30784},[30785],{"id":26328,"depth":135,"text":26329},{"id":26915,"depth":126,"text":26916},"OpenAI's LLMs can power rich workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That usually...",{"img":30789,"date":26991,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server-icon.png","/guides/how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server",{"title":29964,"description":30787},"guides/how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server","_hgROS0P0PltNc1F3TryDIzevJBox68zG5zrZ1Vac4E",{"id":30795,"title":30796,"body":30797,"description":31146,"extension":1576,"meta":31147,"navigation":271,"path":31150,"seo":31151,"stem":31152,"__hash__":31153},"guides/guides/how_to_create_a_unified_connection_to_highlevel.md","How to Create a Unified.to Connection to HighLevel",{"type":9,"value":30798,"toc":31133},[30799,30802,30804,30809,30816,30827,30829,30831,30834,30848,30850,30854,30869,30874,30947,30949,30953,30960,30965,30977,30984,30989,30992,30994,30998,31043,31045,31049,31063,31066,31068,31072,31076,31081,31085,31093,31097,31105,31107,31110,31118,31120,31123],[12,30800,30796],{"id":30801},"how-to-create-a-unifiedto-connection-to-highlevel",[16,30803],{},[19,30805,30806],{},[22,30807,30808],{},"March 19, 2026",[19,30810,30811,30812,30815],{},"This guide explains how to connect an existing HighLevel account to ",[1614,30813,1640],{"href":1638,"rel":30814},[1618],". It assumes:",[72,30817,30818,30821,30824],{},[46,30819,30820],{},"You already have a Unified.to account",[46,30822,30823],{},"You already have a HighLevel account",[46,30825,30826],{},"You have access to a HighLevel Developer (Agency) account",[16,30828],{},[67,30830,9690],{"id":9689},[19,30832,30833],{},"To create a connection between Unified.to and HighLevel, you will:",[43,30835,30836,30839,30842,30845],{},[46,30837,30838],{},"Create or configure a HighLevel OAuth app",[46,30840,30841],{},"Collect required credentials (Client ID, Client Secret, etc.)",[46,30843,30844],{},"Use Unified.to to create a connection",[46,30846,30847],{},"Authorize the connection via OAuth",[16,30849],{},[67,30851,30853],{"id":30852},"step-1-create-a-highlevel-oauth-app","Step 1: Create a HighLevel OAuth App",[43,30855,30856,30864],{},[46,30857,30858,30859],{},"Log in to your HighLevel Developer (Agency) account ",[1614,30860,30863],{"href":30861,"rel":30862},"https://marketplace.gohighlevel.com/apps",[1618],"link",[46,30865,9926,30866,634],{},[478,30867,30868],{},"App Dashboard",[19,30870,30871],{},[1603,30872],{"alt":13589,"src":30873},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-0.png",[43,30875,30876,30881,30944],{},[46,30877,9757,30878],{},[478,30879,30880],{},"Create App",[46,30882,30883,30884,30933,11360,30935,30938,30939,30941],{},"Fill in the required details:",[72,30885,30886,30897,30923],{},[46,30887,30888,30891,30892,30894],{},[478,30889,30890],{},"App Name",": Any name (e.g., Unified Integration)",[17180,30893],{},[1603,30895],{"alt":13589,"src":30896},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-1.png",[46,30898,30899,30901,30902,30905,30906,30909,30910,634,30913,30915,30918,30920],{},[478,30900,25349],{},": In ",[478,30903,30904],{},"Advanced settings → Auth",", set the redirect URL to the value shown on the integration's ",[478,30907,30908],{},"OAuth2 Credentials"," page in ",[1614,30911,1640],{"href":1638,"rel":30912},[1618],[17180,30914],{},[1603,30916],{"alt":13589,"src":30917},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-2.png",[17180,30919],{},[1603,30921],{"alt":13589,"src":30922},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-3.png",[46,30924,30925,30927,30928,30930],{},[478,30926,25481],{},": Use the scopes listed on the HighLevel app setup page.",[17180,30929],{},[1603,30931],{"alt":13589,"src":30932},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-4.png",[17180,30934],{},[1614,30936,1640],{"href":1638,"rel":30937},[1618],", you can also find the required scopes listed below the integration page.",[17180,30940],{},[1603,30942],{"alt":13589,"src":30943},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-5.png",[46,30945,30946],{},"Save the app in HighLevel.",[16,30948],{},[67,30950,30952],{"id":30951},"step-2-get-credentials","Step 2: Get Credentials",[19,30954,30955,30956,30959],{},"After creating the app, go to ",[478,30957,30958],{},"Manage → Secrets"," and add:",[19,30961,30962],{},[1603,30963],{"alt":13589,"src":30964},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-6.png",[72,30966,30967,30972],{},[46,30968,30969],{},[478,30970,30971],{},"Client ID",[46,30973,30974],{},[478,30975,30976],{},"Client Secret",[19,30978,30979,30980,30983],{},"To find the ",[478,30981,30982],{},"Version ID",", open the install link and copy the Version ID from the resulting page.",[19,30985,30986],{},[1603,30987],{"alt":13589,"src":30988},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-7.png",[19,30990,30991],{},"Keep these secure. You will need them in Unified.to.",[16,30993],{},[67,30995,30997],{"id":30996},"step-3-create-connection-in-unifiedto","Step 3: Create Connection in Unified.to",[43,30999,31000,31003,31007,31013,31031,31034,31039],{},[46,31001,31002],{},"Log in to your Unified.to dashboard",[46,31004,9735,31005,634],{},[478,31006,9700],{},[46,31008,12267,31009,31012],{},[478,31010,31011],{},"HighLevel"," as the integration",[46,31014,31015,31016],{},"Enter the following details:\n",[72,31017,31018,31023,31027],{},[46,31019,31020,31022],{},[478,31021,30971],{}," (from HighLevel)",[46,31024,31025,31022],{},[478,31026,30976],{},[46,31028,31029,31022],{},[478,31030,30982],{},[46,31032,31033],{},"Click Activate",[46,31035,11822,31036,634],{},[478,31037,31038],{},"Embedded Components",[46,31040,9757,31041,634],{},[478,31042,31011],{},[16,31044],{},[67,31046,31048],{"id":31047},"step-4-authorize-the-connection","Step 4: Authorize the Connection",[43,31050,31051,31054,31057,31060],{},[46,31052,31053],{},"You will be redirected to HighLevel",[46,31055,31056],{},"Log in (if not already logged in)",[46,31058,31059],{},"Select the account/location you want to connect",[46,31061,31062],{},"Approve the requested permissions",[19,31064,31065],{},"Once approved, you will be redirected back to Unified.to",[16,31067],{},[67,31069,31071],{"id":31070},"common-issues-troubleshooting","Common Issues & Troubleshooting",[35,31073,31075],{"id":31074},"_1-invalid-redirect-uri","1. Invalid Redirect URI",[72,31077,31078],{},[46,31079,31080],{},"Ensure the redirect URL in HighLevel exactly matches the one used by Unified.to",[35,31082,31084],{"id":31083},"_2-unauthorized-401-errors","2. Unauthorized / 401 Errors",[72,31086,31087,31090],{},[46,31088,31089],{},"Double-check Client ID and Client Secret",[46,31091,31092],{},"Ensure the OAuth app is active",[35,31094,31096],{"id":31095},"_3-missing-data","3. Missing Data",[72,31098,31099,31102],{},[46,31100,31101],{},"Ensure correct scopes are selected in HighLevel",[46,31103,31104],{},"Some data may depend on the selected location/account",[16,31106],{},[67,31108,1987],{"id":31109},"notes",[72,31111,31112,31115],{},[46,31113,31114],{},"HighLevel uses location-based access. Make sure you select the correct location during authorization",[46,31116,31117],{},"You can create multiple connections for different locations if needed",[16,31119],{},[19,31121,31122],{},"If you run into issues, reach out to the Unified.to support team with:",[72,31124,31125,31127,31130],{},[46,31126,11916],{},[46,31128,31129],{},"Error logs",[46,31131,31132],{},"Steps to reproduce",{"title":107,"searchDepth":126,"depth":126,"links":31134},[31135,31136,31137,31138,31139,31140,31145],{"id":9689,"depth":126,"text":9690},{"id":30852,"depth":126,"text":30853},{"id":30951,"depth":126,"text":30952},{"id":30996,"depth":126,"text":30997},{"id":31047,"depth":126,"text":31048},{"id":31070,"depth":126,"text":31071,"children":31141},[31142,31143,31144],{"id":31074,"depth":135,"text":31075},{"id":31083,"depth":135,"text":31084},{"id":31095,"depth":135,"text":31096},{"id":31109,"depth":126,"text":1987},"This guide explains how to connect an existing HighLevel account to Unified.to. It assumes,",{"img":31148,"date":31149,"tag":1580},"https://unified.to/images/logo.svg","2026-03-19T20:01:00.000Z","/guides/how_to_create_a_unified_connection_to_highlevel",{"title":30796,"description":31146},"guides/how_to_create_a_unified_connection_to_highlevel","7qCm72_Mb-WS5zTdcEUVkydbPX6ZRQNSbhp4s1OrWrA",{"id":31155,"title":31156,"body":31157,"description":31171,"extension":1576,"meta":31440,"navigation":271,"path":31442,"seo":31443,"stem":31444,"__hash__":31445},"guides/guides/how_to_create_a_xero_connection_in.md","How to Create a Xero Connection in",{"type":9,"value":31158,"toc":31426},[31159,31162,31164,31169,31172,31176,31179,31185,31188,31192,31198,31201,31215,31220,31225,31229,31232,31235,31241,31246,31249,31260,31263,31268,31270,31272,31277,31281,31288,31291,31297,31302,31307,31311,31314,31320,31323,31329,31333,31338,31342,31345,31364,31367,31369,31373,31379,31386,31390,31407,31409,31412],[12,31160,31156],{"id":31161},"how-to-create-a-xero-connection-in",[16,31163],{},[19,31165,31166],{},[22,31167,31168],{},"April 2, 2026",[19,31170,31171],{},"Follow the steps below to create a Xero application and connect it to Unified.to.",[67,31173,31175],{"id":31174},"_1-sign-in-to-the-xero-developer-portal","1. Sign in to the Xero Developer Portal",[19,31177,31178],{},"Go to the Xero Developer portal:",[19,31180,31181],{},[1614,31182,31183],{"href":31183,"rel":31184},"https://developer.xero.com/app/manage/",[1618],[19,31186,31187],{},"Sign in with your Xero account.",[67,31189,31191],{"id":31190},"_2-create-a-new-app","2. Create a New App",[19,31193,31194,31195,634],{},"From the dashboard, click ",[478,31196,31197],{},"Create New App",[19,31199,31200],{},"Choose the appropriate app type and fill in the required details:",[72,31202,31203,31206,31209,31212],{},[46,31204,31205],{},"App name",[46,31207,31208],{},"Company or organization name",[46,31210,31211],{},"Privacy policy URL",[46,31213,31214],{},"Terms and conditions URL (if required)",[19,31216,31217],{},[1603,31218],{"alt":13589,"src":31219},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-0.png",[19,31221,31222],{},[1603,31223],{"alt":13589,"src":31224},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-1.png",[67,31226,31228],{"id":31227},"_3-add-the-redirect-uri","3. Add the Redirect URI",[19,31230,31231],{},"While creating the app, add the OAuth 2.0 Redirect URI provided by Unified.to.",[19,31233,31234],{},"You can find the correct redirect URI here:",[19,31236,31237],{},[1614,31238,31239],{"href":31239,"rel":31240},"https://app.unified.to/integrations/xero?tab=oauth2",[1618],[10506,31242,31243],{},[19,31244,31245],{},"Important: The redirect URI may differ depending on your Unified.to region. Make sure you copy the exact value shown in your Unified.to dashboard.",[19,31247,31248],{},"Examples:",[72,31250,31251,31254,31257],{},[46,31252,31253],{},"US region",[46,31255,31256],{},"EU region",[46,31258,31259],{},"AU region",[19,31261,31262],{},"If the redirect URI does not match exactly, Xero authentication will fail.",[19,31264,31265,31266,634],{},"After adding the redirect URI, click ",[478,31267,30880],{},[16,31269],{},[67,31271],{"id":107},[19,31273,31274],{},[1603,31275],{"alt":13589,"src":31276},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-2.png",[67,31278,31280],{"id":31279},"_4-copy-the-client-id-and-client-secret","4. Copy the Client ID and Client Secret",[19,31282,31283,31284,31287],{},"After the app is created, open the app and go to the ",[478,31285,31286],{},"Configuration"," tab.",[19,31289,31290],{},"There you will find:",[72,31292,31293,31295],{},[46,31294,30971],{},[46,31296,30976],{},[10506,31298,31299],{},[19,31300,31301],{},"Keep the Client Secret secure. Do not share it publicly or commit it to source control.",[19,31303,31304],{},[1603,31305],{"alt":13589,"src":31306},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-3.png",[67,31308,31310],{"id":31309},"_5-add-credentials-to-unifiedto","5. Add Credentials to Unified.to",[19,31312,31313],{},"Open the Xero integration settings page in Unified.to:",[19,31315,31316],{},[1614,31317,31318],{"href":31318,"rel":31319},"https://app.unified.to/integrations/xero?tab=auth",[1618],[19,31321,31322],{},"Paste the following values:",[72,31324,31325,31327],{},[46,31326,30971],{},[46,31328,30976],{},[19,31330,9757,31331,634],{},[478,31332,9760],{},[19,31334,31335],{},[1603,31336],{"alt":13589,"src":31337},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-4.png",[67,31339,31341],{"id":31340},"_6-create-a-connection-using-embedded-components","6. Create a Connection Using Embedded Components",[19,31343,31344],{},"To create a customer-facing connection flow:",[43,31346,31347,31352,31358,31361],{},[46,31348,11822,31349,31351],{},[478,31350,31038],{}," in Unified.to.",[46,31353,12325,31354,31357],{},[478,31355,31356],{},"Xero"," integration.",[46,31359,31360],{},"Launch the embedded authorization flow.",[46,31362,31363],{},"Complete the authorization process.",[19,31365,31366],{},"This allows your end users to connect their Xero account directly from your application.",[67,31368,1987],{"id":31109},[35,31370,31372],{"id":31371},"journals-endpoint-availability","Journals Endpoint Availability",[19,31374,2288,31375,31378],{},[109,31376,31377],{},"Journals"," endpoint is a premium Xero feature.",[19,31380,31381,31382,31385],{},"According to Xero's documentation, the Journals API is only available starting with the ",[478,31383,31384],{},"Advanced"," pricing tier. Customers using lower Xero plans may receive authorization or access errors when calling this endpoint.",[35,31387,31389],{"id":31388},"common-issues","Common Issues",[72,31391,31392,31395,31398,31401,31404],{},[46,31393,31394],{},"Ensure the redirect URI in Xero exactly matches the one shown in Unified.to.",[46,31396,31397],{},"Make sure you are using the correct region-specific Unified.to redirect URI.",[46,31399,31400],{},"If you regenerate the Client Secret in Xero, you must update it in Unified.to.",[46,31402,31403],{},"Only users with sufficient permissions in Xero can authorize an organization.",[46,31405,31406],{},"If you have previously selected an organization for the same Xero app, Xero may automatically reuse that organization during future authorizations.",[35,31408,10128],{"id":10127},[19,31410,31411],{},"If authentication fails:",[72,31413,31414,31417,31420,31423],{},[46,31415,31416],{},"Verify the Client ID and Client Secret are correct.",[46,31418,31419],{},"Double-check the redirect URI.",[46,31421,31422],{},"Re-authorize the connection after saving any changes.",[46,31424,31425],{},"Remove the existing connection and create a new one if necessary.",{"title":107,"searchDepth":126,"depth":126,"links":31427},[31428,31429,31430,31431,31432,31433,31434,31435],{"id":31174,"depth":126,"text":31175},{"id":31190,"depth":126,"text":31191},{"id":31227,"depth":126,"text":31228},{"id":107,"depth":126,"text":107},{"id":31279,"depth":126,"text":31280},{"id":31309,"depth":126,"text":31310},{"id":31340,"depth":126,"text":31341},{"id":31109,"depth":126,"text":1987,"children":31436},[31437,31438,31439],{"id":31371,"depth":135,"text":31372},{"id":31388,"depth":135,"text":31389},{"id":10127,"depth":135,"text":10128},{"img":31148,"date":31441,"tag":1580},"2026-04-02T18:29:00.000Z","/guides/how_to_create_a_xero_connection_in",{"title":31156,"description":31171},"guides/how_to_create_a_xero_connection_in","Nao6bxHE8cN8ObdS4SXjX7jhsyBqT5TVktHI-5UfOA8",{"id":31447,"title":31448,"body":31449,"description":32238,"extension":1576,"meta":32239,"navigation":271,"path":32242,"seo":32243,"stem":32244,"__hash__":32245},"guides/guides/how_to_create_and_configure_webhooks.md","How to create and configure webhooks",{"type":9,"value":31450,"toc":32222},[31451,31454,31456,31461,31464,31472,31474,31482,31485,31488,31491,31495,31502,31593,31600,31611,31614,31708,31714,31740,31744,31751,31781,31784,31788,31791,31851,31855,31870,31879,31883,31886,31901,31908,31915,31919,31924,31930,31933,31941,31945,31956,31963,31966,31977,31984,32000,32004,32007,32027,32030,32039,32042,32046,32051,32061,32066,32069,32074,32084,32089,32096,32101,32104,32112,32115,32123,32205,32207,32219],[12,31452,31448],{"id":31453},"how-to-create-and-configure-webhooks",[16,31455],{},[19,31457,31458],{},[22,31459,31460],{},"September 4, 2024",[19,31462,31463],{},"This guide goes over how to create and configure webhooks with Unified.to. Webhooks allow you to receive real-time data events when there are updates in your customers' accounts.",[19,31465,31466,31467,634],{},"Looking for help with troubleshooting webhook issues? See: ",[1614,31468,31471],{"href":31469,"rel":31470},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_webhooks",[1618],"How to troubleshoot unhealthy webhooks",[67,31473,13634],{"id":13633},[19,31475,31476,31477,634],{},"This guide assumes you have a basic understanding of ",[1614,31478,31481],{"href":31479,"rel":31480},"https://docs.unified.to/concepts/webhooks",[1618],"webhooks",[67,31483,18727],{"id":31484},"create-a-webhook",[19,31486,31487],{},"Webhooks and connections are closely related; webhooks can only be created from existing connections and you can create multiple webhooks off a single connection. If you delete a connection, any webhooks that are associated with it will also be deleted.",[19,31489,31490],{},"There are two ways to create a webhook:",[35,31492,31494],{"id":31493},"method-1-use-the-unified-api","Method 1: Use the Unified API",[19,31496,31497,31498,31501],{},"Send a POST request to ",[109,31499,31500],{},"/unified/webhook","(see below for configuration options). For example:",[102,31503,31505],{"className":9951,"code":31504,"language":9953,"meta":107,"style":107},"POST /unified/webhook?include_all=true\n\n{\n    hook_url: `${YOUR_WEBHOOK_URL}`,\n    connection_id: `${CONNECTION_ID}`\n    object_type: 'ats_candidate', // data to subscribe to\n    event: 'updated', // type of event to listen for\n}\n",[109,31506,31507,31530,31534,31538,31552,31563,31576,31589],{"__ignoreMap":107},[112,31508,31509,31512,31514,31517,31519,31521,31523,31526,31528],{"class":114,"line":115},[112,31510,31511],{"class":129},"POST",[112,31513,4705],{"class":229},[112,31515,31516],{"class":236},"unified",[112,31518,12874],{"class":229},[112,31520,18788],{"class":236},[112,31522,4711],{"class":229},[112,31524,31525],{"class":236},"include_all",[112,31527,335],{"class":229},[112,31529,4144],{"class":129},[112,31531,31532],{"class":114,"line":126},[112,31533,272],{"emptyLinePlaceholder":271},[112,31535,31536],{"class":114,"line":135},[112,31537,2327],{"class":236},[112,31539,31540,31543,31545,31548,31550],{"class":114,"line":147},[112,31541,31542],{"class":236},"    hook_url: ",[112,31544,26816],{"class":122},[112,31546,31547],{"class":129},"YOUR_WEBHOOK_URL",[112,31549,640],{"class":122},[112,31551,288],{"class":236},[112,31553,31554,31557,31559,31561],{"class":114,"line":202},[112,31555,31556],{"class":236},"    connection_id: ",[112,31558,26816],{"class":122},[112,31560,17908],{"class":129},[112,31562,14075],{"class":122},[112,31564,31565,31568,31571,31573],{"class":114,"line":208},[112,31566,31567],{"class":236},"    object_type: ",[112,31569,31570],{"class":122},"'ats_candidate'",[112,31572,1046],{"class":236},[112,31574,31575],{"class":578},"// data to subscribe to\n",[112,31577,31578,31581,31584,31586],{"class":114,"line":291},[112,31579,31580],{"class":236},"    event: ",[112,31582,31583],{"class":122},"'updated'",[112,31585,1046],{"class":236},[112,31587,31588],{"class":578},"// type of event to listen for\n",[112,31590,31591],{"class":114,"line":299},[112,31592,584],{"class":236},[19,31594,31595,2251,31597],{},[478,31596,18117],{},[1614,31598,18727],{"href":14661,"rel":31599},[1618],[19,31601,31602,31603,31605,31606,772],{},"By including the optional parameter ",[109,31604,31525],{}," in the query, the webhook will receive all historical data for the connection (see:",[1614,31607,31610],{"href":31608,"rel":31609},"https://docs.unified.to/guides/how_to_create_and_configure_webhooks#get-all-initial-data-for-a-connection",[1618]," Get all initial data for a connection",[19,31612,31613],{},"This is the payload that your server receives when webhook data comes in:",[1868,31615,31616,31628],{},[1871,31617,31618],{},[1874,31619,31620,31623,31625],{},[1877,31621,31622],{},"Name",[1877,31624,2428],{},[1877,31626,31627],{},"Desc",[1890,31629,31630,31644,31662,31675,31692],{},[1874,31631,31632,31636,31641],{},[1895,31633,31634],{},[109,31635,18783],{},[1895,31637,31638],{},[22,31639,31640],{},"object array",[1895,31642,31643],{},"An array of objects specific to the webhook's connection. (eg. CRM contacts)",[1874,31645,31646,31650,31659],{},[1895,31647,31648],{},[109,31649,18788],{},[1895,31651,31652],{},[1614,31653,31656],{"href":31654,"rel":31655},"https://docs.unified.to/unified/webhook/model",[1618],[22,31657,31658],{},"Webhook",[1895,31660,31661],{},"The webhook object. You can use the id to manage or delete your webhook.",[1874,31663,31664,31668,31672],{},[1895,31665,31666],{},[109,31667,18793],{},[1895,31669,31670],{},[22,31671,2445],{},[1895,31673,31674],{},"Random string",[1874,31676,31677,31681,31685],{},[1895,31678,31679],{},[109,31680,18798],{},[1895,31682,31683],{},[22,31684,2445],{},[1895,31686,31687,31688,31691],{},"A security signature generated using HMAC-SHA1. It combines your workspace secret with the payload data and nonce i.e ",[109,31689,31690],{},"HMAC-SHA1(workspace.secret, data + nonce)"," . Use this to verify the authenticity of incoming webhooks.",[1874,31693,31694,31698,31703],{},[1895,31695,31696],{},[109,31697,2472],{},[1895,31699,31700],{},[22,31701,31702],{},"enum",[1895,31704,31705],{},[109,31706,31707],{},"INITIAL-PARTIAL, INITIAL-COMPLETE, VIRTUAL, NATIVE",[19,31709,31710,31711,31713],{},"A note on the ",[109,31712,2472],{}," enums:",[72,31715,31716,31722,31728,31734],{},[46,31717,31718,31721],{},[109,31719,31720],{},"INITIAL-PARTIAL",": included with each page of results for the initial sync",[46,31723,31724,31727],{},[109,31725,31726],{},"INITIAL-COMPLETE",": included with last page (e.g. last 5 elements for the limit 100) of initial sync or with an empty list (no more results)",[46,31729,31730,31733],{},[109,31731,31732],{},"VIRTUAL",": included with every page when reading new data from a virtual webhook",[46,31735,31736,31739],{},[109,31737,31738],{},"NATIVE",": included with every page when reading new data from a native webhook",[35,31741,31743],{"id":31742},"method-2-use-the-unifiedto-app","Method 2: Use the Unified.to app",[19,31745,31746,31747,634],{},"If you prefer to create webhooks through the UI, you can do so at ",[1614,31748,31750],{"href":11523,"rel":31749},[1618],"app.unified.to",[43,31752,31753,31765,31770,31773,31776],{},[46,31754,9735,31755,31757,31758,634],{},[478,31756,9700],{}," > ",[1614,31759,31762],{"href":31760,"rel":31761},"https://app.unified.to/webhooks",[1618],[478,31763,31764],{},"Webhooks",[46,31766,9757,31767,634],{},[478,31768,31769],{},"New Webhook",[46,31771,31772],{},"Click on the input and a list of your connections will appear. Select the connection from which you want to create a webhook.",[46,31774,31775],{},"Choose how to configure your webhook (see below).",[46,31777,9757,31778,634],{},[478,31779,31780],{},"Save",[19,31782,31783],{},"Information about the other fields can be found under their respective tooltips in the UI.",[35,31785,31787],{"id":31786},"webhook-configuration-options","Webhook configuration options",[19,31789,31790],{},"Whether you use the API or our web UI, these are the configuration options you can specify when creating a webhook:",[43,31792,31793,31799,31812,31823,31834,31845],{},[46,31794,31795,31798],{},[478,31796,31797],{},"Object:"," The data you are interested in e.g. Deal, Company, Application, etc.",[46,31800,31801,31804,31805,31808,31809,634],{},[478,31802,31803],{},"Event:"," The events you want to subscribe to. Note: The ",[22,31806,31807],{},"updated"," event will also be sent when the data object is first ",[22,31810,31811],{},"created",[46,31813,31814,31817,31818,634],{},[478,31815,31816],{},"Type:"," For integrations that support both native and virtual webhooks, select the type of webhook you want. Virtual webhooks are our way of supporting webhooks for API providers that don't offer them. For more details, see: ",[1614,31819,31822],{"href":31820,"rel":31821},"https://docs.unified.to/guides/understanding_virtual_webhooks#understanding-native-and-virtual-webhooks",[1618],"Understanding virtual webhooks",[46,31824,31825,31828,31829],{},[478,31826,31827],{},"Filter (optional):"," Specify any properties you want to filter incoming events by. See: ",[1614,31830,31833],{"href":31831,"rel":31832},"https://docs.unified.to/guides/how_to_create_and_configure_webhooks#use-filters-to-refine-webhook-events",[1618],"Use filters to refine webhook events",[46,31835,31836,31839,31840,634],{},[478,31837,31838],{},"Fields (optional):","  Comma-separated list of fields to include in the webhook payload. Leave blank to include all fields. The 'raw' field is NOT included by default. If you want to include all fields as well raw, just enter 'raw'. To read more about raw fields, see: ",[1614,31841,31844],{"href":31842,"rel":31843},"https://docs.unified.to/reference/fields",[1618],"Raw and custom fields",[46,31846,31847,31850],{},[478,31848,31849],{},"Interval (virtual webhooks only):"," Specify how often you want Unified.to to poll the API provider for new data.",[67,31852,31854],{"id":31853},"list-your-webhooks","List your webhooks",[19,31856,31857,31858,31860,31861,31864,31865,634],{},"To view your webhooks, make a GET request to ",[109,31859,31500],{}," or visit ",[1614,31862,31750],{"href":11523,"rel":31863},[1618]," and navigate to Integrations > ",[1614,31866,31868],{"href":31760,"rel":31867},[1618],[478,31869,31764],{},[19,31871,31872,2251,31874],{},[478,31873,18117],{},[1614,31875,31878],{"href":31876,"rel":31877},"https://docs.unified.to/unified/webhook/Returns_all_registered_webhooks",[1618],"Get all webhooks",[67,31880,31882],{"id":31881},"get-all-initial-data-for-a-connection","Get all initial data for a connection",[19,31884,31885],{},"When you create a webhook, you can choose to fetch all existing data immediately.",[43,31887,31888,31894],{},[46,31889,31890,31891,31893],{},"If you are using the API, add the ",[109,31892,31525],{}," query parameter when creating the webhook.",[46,31895,31896,31897,31900],{},"If you are using the UI, check off ",[478,31898,31899],{},"Initially sync all data"," in the configuration options.",[19,31902,31903,31904,31907],{},"Once the initial sync is complete, you will receive a final payload with ",[109,31905,31906],{},"type: INITIAL-COMPLETE"," and the requested webhook will continue to work as normal.",[19,31909,31910,2251,31912],{},[478,31911,18117],{},[1614,31913,25960],{"href":14661,"rel":31914},[1618],[67,31916,31918],{"id":31917},"a-note-on-retrieving-webhook-data","A note on retrieving webhook data",[19,31920,31921,31922,634],{},"Our system will POST initial data to your webhook in chunk sizes up to the limit supported by the integration. The limit can be found on the integration details page under ",[478,31923,12322],{},[19,31925,31926,31927,31929],{},"When performing the initial retrieval, depending on the amount of data being sent, the integration's API's rate-limiting rules, and your server's performance, it could take a very long time. If you do not want to get all of the existing data (for example, you already have it or don't need it), then do not include the ",[109,31928,31525],{}," parameter in the request.",[19,31931,31932],{},"After the initial retrieval is completed, whenever updated data is available, your webhook will be called with a list of data objects, up to the max limit.  If there are more entries than the limit, then your webhook URL will be POSTed to multiple times.",[19,31934,31935,31936,634],{},"For details about the webhook payload that is sent to your server, ",[1614,31937,31940],{"href":31938,"rel":31939},"https://docs.unified.to/concepts/webhooks#webhook-payload",[1618],"click here",[67,31942,31944],{"id":31943},"specify-which-fields-to-receive-from-a-webhook","Specify which fields to receive from a webhook",[19,31946,31947,31948,31951,31952,634],{},"If you only want a subset of fields when receiving updated data, you can define them with the ",[109,31949,31950],{},"fields"," parameter in both the API and the UI. This is useful if you don't want the entire payload being sent to your servers. For more details, see: ",[1614,31953,31955],{"href":31842,"rel":31954},[1618],"Fields",[19,31957,31958,2251,31960],{},[478,31959,18117],{},[1614,31961,25960],{"href":14661,"rel":31962},[1618],[67,31964,31833],{"id":31965},"use-filters-to-refine-webhook-events",[19,31967,31968,2251,31971],{},[22,31969,31970],{},"Note: This feature is only available for virtual webhooks. For more information about virtual webhooks, see:",[1614,31972,31975],{"href":31973,"rel":31974},"https://docs.unified.to/guides/understanding_native_and_virtual_webhooks#understanding-native-and-virtual-webhooks",[1618],[22,31976,31822],{},[19,31978,31979,31980,31983],{},"Some virtual webhooks support filters, allowing you to filter the events you receive. For instance, if you're subscribed to Deal events from a CRM, you could filter by ",[109,31981,31982],{},"company_id"," to only receive events from that specific company.",[19,31985,31986,31987,31990,31991,31993,31994,9571,31997,31999],{},"Filter availability varies by integration type and data model. To check which filters are supported for a particular webhook, refer to the ",[478,31988,31989],{},"List"," section under the ",[478,31992,12328],{}," tab of the respective integration. Parameters that end in ",[109,31995,31996],{},"_id",[109,31998,2472],{}," can be used as filter options when creating a webhook, helping you tailor your subscriptions to your specific needs.",[67,32001,32003],{"id":32002},"trigger-webhooks-manually","Trigger webhooks manually",[19,32005,32006],{},"If you don't want to wait for an event to come in while testing webhooks on a Tester plan, you can trigger a webhook call right away.",[43,32008,32009,32015],{},[46,32010,32011,32012,634],{},"In the web app, navigate to ",[1614,32013,31764],{"href":31760,"rel":32014},[1618],[46,32016,32017,32018,32021,32022,32024],{},"Click the ",[478,32019,32020],{},"Trigger"," icon next to your webhook:",[17180,32023],{},[1603,32025],{"alt":11593,"src":32026},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_and_configure_webhooks-0.png",[19,32028,32029],{},"This can also be accomplished with the API.",[19,32031,32032,2251,32034],{},[478,32033,18117],{},[1614,32035,32038],{"href":32036,"rel":32037},"https://docs.unified.to/unified/webhook/Trigger_webhook",[1618],"Trigger a webhook",[19,32040,32041],{},"Note**:** When you trigger a webhook, we will schedule the next dispatch event to go out right away - this is treated like a regular webhook event. Therefore, if your webhook is listening for update events and no new updates have occurred since the last run, then no new events will be sent to your server.",[67,32043,32045],{"id":32044},"frequently-asked-questions","Frequently asked questions",[19,32047,32048],{},[478,32049,32050],{},"Is there a page_max_limit for webhooks?",[19,32052,32053,32054,32057,32058,32060],{},"An integration's ",[109,32055,32056],{},"page_max_limit"," typically comes directly from the API provider. You can see that limit under the ",[478,32059,12328],{}," tab on the integration details page**.** You don't have to set limits for webhooks; they will use the integration's max limit.",[19,32062,32063],{},[478,32064,32065],{},"Does changing the interval for virtual webhooks affect the initial retrieval?",[19,32067,32068],{},"Increasing frequency of virtual webhooks has no effect on the initial retrieval of historical data. Each page read is scheduled to be read one after another as soon as possible.",[19,32070,32071],{},[478,32072,32073],{},"How do I distinguish between an updated event and a created event?",[19,32075,32076,32077,11338,32080,32083],{},"When a new data object is created, it triggers both created and updated events. If you want to track both of these events but also tell them apart, we recommend subscribing to the updated event and then compare ",[109,32078,32079],{},"created_at",[109,32081,32082],{},"updated_at"," for incoming data. If they are the same, that means the data object was newly created.",[19,32085,32086],{},[478,32087,32088],{},"What happens if the webhook dispatch fails? Is there a retry mechanism in place?",[19,32090,32091,32092,634],{},"Our retry mechanism will retry 3 times immediately before using a Fibonacci backoff strategy. Read more about it ",[1614,32093,17258],{"href":32094,"rel":32095},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_webhooks#a-note-on-our-webhook-retry-mechanism",[1618],[19,32097,32098],{},[478,32099,32100],{},"Why do I receive duplicate webhook events and how should I handle them?",[19,32102,32103],{},"Duplicate webhook events can occur for several reasons:",[72,32105,32106,32109],{},[46,32107,32108],{},"Some integrations (like HubSpot) trigger separate events for each property change on an object",[46,32110,32111],{},"Rapid changes to objects can trigger multiple events that may arrive out of order due to network conditions",[19,32113,32114],{},"To handle duplicates effectively:",[43,32116,32117,32120],{},[46,32118,32119],{},"Always use the object's latest state when updating your database",[46,32121,32122],{},"Implement atomic writes to avoid race conditions. Only update records if the incoming data is newer:",[102,32124,32126],{"className":9951,"code":32125,"language":9953,"meta":107,"style":107},"-- Pseudo-code example\nIF incoming_object.updated_at >= stored_object.updated_at THEN\n    UPDATE record\nELSE\n    -- Skip update as we already have newer data\nEND IF\n",[109,32127,32128,32141,32158,32166,32171,32197],{"__ignoreMap":107},[112,32129,32130,32133,32136,32138],{"class":114,"line":115},[112,32131,32132],{"class":229},"--",[112,32134,32135],{"class":236}," Pseudo",[112,32137,23301],{"class":229},[112,32139,32140],{"class":236},"code example\n",[112,32142,32143,32146,32149,32152,32155],{"class":114,"line":126},[112,32144,32145],{"class":129},"IF",[112,32147,32148],{"class":236}," incoming_object.updated_at ",[112,32150,32151],{"class":229},">=",[112,32153,32154],{"class":236}," stored_object.updated_at ",[112,32156,32157],{"class":129},"THEN\n",[112,32159,32160,32163],{"class":114,"line":135},[112,32161,32162],{"class":129},"    UPDATE",[112,32164,32165],{"class":236}," record\n",[112,32167,32168],{"class":114,"line":147},[112,32169,32170],{"class":129},"ELSE\n",[112,32172,32173,32176,32179,32182,32185,32188,32191,32194],{"class":114,"line":202},[112,32174,32175],{"class":229},"    --",[112,32177,32178],{"class":236}," Skip update ",[112,32180,32181],{"class":229},"as",[112,32183,32184],{"class":118}," we",[112,32186,32187],{"class":118}," already",[112,32189,32190],{"class":118}," have",[112,32192,32193],{"class":118}," newer",[112,32195,32196],{"class":118}," data\n",[112,32198,32199,32202],{"class":114,"line":208},[112,32200,32201],{"class":129},"END",[112,32203,32204],{"class":129}," IF\n",[67,32206,25945],{"id":25944},[72,32208,32209,32214],{},[46,32210,32211],{},[1614,32212,31471],{"href":31469,"rel":32213},[1618],[46,32215,32216],{},[1614,32217,31822],{"href":31820,"rel":32218},[1618],[1558,32220,32221],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":107,"searchDepth":126,"depth":126,"links":32223},[32224,32225,32230,32231,32232,32233,32234,32235,32236,32237],{"id":13633,"depth":126,"text":13634},{"id":31484,"depth":126,"text":18727,"children":32226},[32227,32228,32229],{"id":31493,"depth":135,"text":31494},{"id":31742,"depth":135,"text":31743},{"id":31786,"depth":135,"text":31787},{"id":31853,"depth":126,"text":31854},{"id":31881,"depth":126,"text":31882},{"id":31917,"depth":126,"text":31918},{"id":31943,"depth":126,"text":31944},{"id":31965,"depth":126,"text":31833},{"id":32002,"depth":126,"text":32003},{"id":32044,"depth":126,"text":32045},{"id":25944,"depth":126,"text":25945},"This guide goes over how to create and configure webhooks with Unified.to. Webhooks allow you to receive real-time data events when there are updates in your...",{"img":32240,"date":32241,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_and_configure_webhooks-icon.png","2024-09-04T00:00:00.000Z","/guides/how_to_create_and_configure_webhooks",{"title":31448,"description":32238},"guides/how_to_create_and_configure_webhooks","Bik0YwuD_O88pv20wBEX8ldfmQWOtG1tunw8joHLxi0",{"id":32247,"title":32248,"body":32249,"description":32859,"extension":1576,"meta":32860,"navigation":271,"path":32863,"seo":32864,"stem":32865,"__hash__":32866},"guides/guides/how_to_create_connection_with_hubspot.md","How to create Connection with Hubspot",{"type":9,"value":32250,"toc":32857},[32251,32254,32256,32261,32269,32274,32279,32284,32289,32292,32297,32302,32307,32312,32317,32342,32347,32352,32357,32362,32367,32382,32387,32392,32397,32402,32407,32412,32417,32422,32427,32432,32776,32781,32789,32794,32799,32804,32809,32814,32819,32824,32829,32834,32839,32851,32854],[12,32252,32248],{"id":32253},"how-to-create-connection-with-hubspot",[16,32255],{},[19,32257,32258],{},[22,32259,32260],{},"December 17, 2025",[19,32262,32263,32264,32268],{},"Hubspot provides Free Developer Sandbox Account. You can create that from following ",[1614,32265,30863],{"href":32266,"rel":32267},"https://offers.hubspot.com/free-cms-developer-sandbox",[1618]," .",[43,32270,32271],{},[46,32272,32273],{},"Create an account.",[19,32275,32276],{},[1603,32277],{"alt":13589,"src":32278},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-0.png",[43,32280,32281],{},[46,32282,32283],{},"Provide name of the account",[19,32285,32286],{},[1603,32287],{"alt":13589,"src":32288},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-1.png",[19,32290,32291],{},"After account is created it will redirect you to following page:-",[19,32293,32294],{},[1603,32295],{"alt":13589,"src":32296},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-2.png",[43,32298,32299],{},[46,32300,32301],{},"Goto Development page from the size menu",[19,32303,32304],{},[1603,32305],{"alt":13589,"src":32306},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-3.png",[43,32308,32309],{},[46,32310,32311],{},"Create a project in IDE and install and install using following command",[19,32313,32314],{},[1603,32315],{"alt":13589,"src":32316},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-4.png",[102,32318,32320],{"className":9951,"code":32319,"language":9953,"meta":107,"style":107},"npm install -g @hubspot/cli && hs init\n",[109,32321,32322],{"__ignoreMap":107},[112,32323,32324,32327,32329,32332,32334,32337,32339],{"class":114,"line":115},[112,32325,32326],{"class":236},"npm install ",[112,32328,23301],{"class":229},[112,32330,32331],{"class":236},"g @hubspot",[112,32333,12874],{"class":229},[112,32335,32336],{"class":236},"cli ",[112,32338,28529],{"class":229},[112,32340,32341],{"class":236}," hs init\n",[43,32343,32344],{},[46,32345,32346],{},"Create your Personal Access Key.\nIt will be inside the keys menu",[19,32348,32349],{},[1603,32350],{"alt":13589,"src":32351},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-5.png",[43,32353,32354],{},[46,32355,32356],{},"Paste that key in your terminal when your hubspot application ask for it.",[19,32358,32359],{},[1603,32360],{"alt":13589,"src":32361},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-6.png",[43,32363,32364],{},[46,32365,32366],{},"Now we will create a project.\nrun following command in that same project.",[102,32368,32370],{"className":9951,"code":32369,"language":9953,"meta":107,"style":107},"hs get-started\n",[109,32371,32372],{"__ignoreMap":107},[112,32373,32374,32377,32379],{"class":114,"line":115},[112,32375,32376],{"class":236},"hs get",[112,32378,23301],{"class":229},[112,32380,32381],{"class":236},"started\n",[19,32383,32384],{},[1603,32385],{"alt":13589,"src":32386},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-7.png",[43,32388,32389],{},[46,32390,32391],{},"Write Y to upload that project in the hubspot application.",[19,32393,32394],{},[1603,32395],{"alt":13589,"src":32396},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-8.png",[43,32398,32399],{},[46,32400,32401],{},"Again select Y for following",[19,32403,32404],{},[1603,32405],{"alt":13589,"src":32406},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-9.png",[43,32408,32409],{},[46,32410,32411],{},"It will redirect to hubspot page.\ngoto to following page:-\nConnected Apps→ Manage Location → click the check box → Save.",[19,32413,32414],{},[1603,32415],{"alt":13589,"src":32416},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-10.png",[43,32418,32419],{},[46,32420,32421],{},"In your project(code) you will see following folder structure.\nGOTO→ yourproject (account-testing) → app-hsmeta.json",[19,32423,32424],{},[1603,32425],{"alt":13589,"src":32426},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-11.png",[43,32428,32429],{},[46,32430,32431],{},"Following will be the scopes and redirect URL. You can remove which you want. However, do remember those removed scopes before creating a connection in unified. Also remember to add redirect URL as follows.",[102,32433,32435],{"className":9951,"code":32434,"language":9953,"meta":107,"style":107},"{\n  \"uid\": \"get_started_app\",\n  \"type\": \"app\",\n  \"config\": {\n    \"description\": \"A Unified.to token app for testing\",\n    \"name\": \"My Get Started app\",\n    \"distribution\": \"private\",\n    \"auth\": {\n      \"type\": \"oauth\",\n      \"redirectUrls\": [\n        \"https://api.unified.to/oauth/code\",\n      ],\n      \"requiredScopes\": [\n        \"oauth\",\n        \"crm.objects.companies.read\",\n        \"crm.objects.contacts.read\",\n        \"crm.objects.deals.read\",\n        \"crm.objects.owners.read\",\n        \"crm.pipelines.orders.read\",\n        \"crm.objects.contacts.write\",\n        \"crm.pipelines.orders.read\",\n        \"crm.pipelines.orders.write\",\n        \"crm.objects.deals.write\",\n        \"sales-email-read\",\n        \"content\",\n        \"tickets\",\n        \"crm.lists.read\",\n        \"settings.users.teams.read\"\n      ],\n      \"optionalScopes\": [],\n      \"conditionallyRequiredScopes\": []\n    },\n    \"permittedUrls\": {\n      \"fetch\": [\"https://api.hubapi.com\"],\n      \"iframe\": [],\n      \"img\": []\n    },\n    \"support\": {\n      \"supportEmail\": \"support@example.com\",\n      \"documentationUrl\": \"https://example.com/docs\",\n      \"supportUrl\": \"https://example.com/support\",\n      \"supportPhone\": \"+18005555555\"\n    }\n  }\n}\n",[109,32436,32437,32441,32452,32463,32469,32481,32492,32504,32511,32523,32530,32537,32541,32548,32555,32562,32569,32576,32583,32590,32597,32603,32610,32617,32624,32631,32638,32645,32650,32654,32662,32670,32674,32681,32693,32700,32707,32711,32718,32730,32742,32754,32764,32768,32772],{"__ignoreMap":107},[112,32438,32439],{"class":114,"line":115},[112,32440,2327],{"class":236},[112,32442,32443,32445,32447,32450],{"class":114,"line":126},[112,32444,25734],{"class":122},[112,32446,2335],{"class":236},[112,32448,32449],{"class":122},"\"get_started_app\"",[112,32451,288],{"class":236},[112,32453,32454,32456,32458,32461],{"class":114,"line":135},[112,32455,8956],{"class":122},[112,32457,2335],{"class":236},[112,32459,32460],{"class":122},"\"app\"",[112,32462,288],{"class":236},[112,32464,32465,32467],{"class":114,"line":147},[112,32466,25756],{"class":122},[112,32468,3888],{"class":236},[112,32470,32471,32474,32476,32479],{"class":114,"line":202},[112,32472,32473],{"class":122},"    \"description\"",[112,32475,2335],{"class":236},[112,32477,32478],{"class":122},"\"A Unified.to token app for testing\"",[112,32480,288],{"class":236},[112,32482,32483,32485,32487,32490],{"class":114,"line":208},[112,32484,26184],{"class":122},[112,32486,2335],{"class":236},[112,32488,32489],{"class":122},"\"My Get Started app\"",[112,32491,288],{"class":236},[112,32493,32494,32497,32499,32502],{"class":114,"line":291},[112,32495,32496],{"class":122},"    \"distribution\"",[112,32498,2335],{"class":236},[112,32500,32501],{"class":122},"\"private\"",[112,32503,288],{"class":236},[112,32505,32506,32509],{"class":114,"line":299},[112,32507,32508],{"class":122},"    \"auth\"",[112,32510,3888],{"class":236},[112,32512,32513,32516,32518,32521],{"class":114,"line":307},[112,32514,32515],{"class":122},"      \"type\"",[112,32517,2335],{"class":236},[112,32519,32520],{"class":122},"\"oauth\"",[112,32522,288],{"class":236},[112,32524,32525,32528],{"class":114,"line":315},[112,32526,32527],{"class":122},"      \"redirectUrls\"",[112,32529,2372],{"class":236},[112,32531,32532,32535],{"class":114,"line":323},[112,32533,32534],{"class":122},"        \"https://api.unified.to/oauth/code\"",[112,32536,288],{"class":236},[112,32538,32539],{"class":114,"line":329},[112,32540,4450],{"class":236},[112,32542,32543,32546],{"class":114,"line":341},[112,32544,32545],{"class":122},"      \"requiredScopes\"",[112,32547,2372],{"class":236},[112,32549,32550,32553],{"class":114,"line":346},[112,32551,32552],{"class":122},"        \"oauth\"",[112,32554,288],{"class":236},[112,32556,32557,32560],{"class":114,"line":366},[112,32558,32559],{"class":122},"        \"crm.objects.companies.read\"",[112,32561,288],{"class":236},[112,32563,32564,32567],{"class":114,"line":381},[112,32565,32566],{"class":122},"        \"crm.objects.contacts.read\"",[112,32568,288],{"class":236},[112,32570,32571,32574],{"class":114,"line":387},[112,32572,32573],{"class":122},"        \"crm.objects.deals.read\"",[112,32575,288],{"class":236},[112,32577,32578,32581],{"class":114,"line":392},[112,32579,32580],{"class":122},"        \"crm.objects.owners.read\"",[112,32582,288],{"class":236},[112,32584,32585,32588],{"class":114,"line":409},[112,32586,32587],{"class":122},"        \"crm.pipelines.orders.read\"",[112,32589,288],{"class":236},[112,32591,32592,32595],{"class":114,"line":422},[112,32593,32594],{"class":122},"        \"crm.objects.contacts.write\"",[112,32596,288],{"class":236},[112,32598,32599,32601],{"class":114,"line":435},[112,32600,32587],{"class":122},[112,32602,288],{"class":236},[112,32604,32605,32608],{"class":114,"line":440},[112,32606,32607],{"class":122},"        \"crm.pipelines.orders.write\"",[112,32609,288],{"class":236},[112,32611,32612,32615],{"class":114,"line":4949},[112,32613,32614],{"class":122},"        \"crm.objects.deals.write\"",[112,32616,288],{"class":236},[112,32618,32619,32622],{"class":114,"line":4960},[112,32620,32621],{"class":122},"        \"sales-email-read\"",[112,32623,288],{"class":236},[112,32625,32626,32629],{"class":114,"line":4972},[112,32627,32628],{"class":122},"        \"content\"",[112,32630,288],{"class":236},[112,32632,32633,32636],{"class":114,"line":4984},[112,32634,32635],{"class":122},"        \"tickets\"",[112,32637,288],{"class":236},[112,32639,32640,32643],{"class":114,"line":4992},[112,32641,32642],{"class":122},"        \"crm.lists.read\"",[112,32644,288],{"class":236},[112,32646,32647],{"class":114,"line":5000},[112,32648,32649],{"class":122},"        \"settings.users.teams.read\"\n",[112,32651,32652],{"class":114,"line":5008},[112,32653,4450],{"class":236},[112,32655,32656,32659],{"class":114,"line":5016},[112,32657,32658],{"class":122},"      \"optionalScopes\"",[112,32660,32661],{"class":236},": [],\n",[112,32663,32664,32667],{"class":114,"line":5024},[112,32665,32666],{"class":122},"      \"conditionallyRequiredScopes\"",[112,32668,32669],{"class":236},": []\n",[112,32671,32672],{"class":114,"line":5032},[112,32673,988],{"class":236},[112,32675,32676,32679],{"class":114,"line":5040},[112,32677,32678],{"class":122},"    \"permittedUrls\"",[112,32680,3888],{"class":236},[112,32682,32683,32686,32688,32691],{"class":114,"line":5046},[112,32684,32685],{"class":122},"      \"fetch\"",[112,32687,3903],{"class":236},[112,32689,32690],{"class":122},"\"https://api.hubapi.com\"",[112,32692,3908],{"class":236},[112,32694,32695,32698],{"class":114,"line":5052},[112,32696,32697],{"class":122},"      \"iframe\"",[112,32699,32661],{"class":236},[112,32701,32702,32705],{"class":114,"line":5061},[112,32703,32704],{"class":122},"      \"img\"",[112,32706,32669],{"class":236},[112,32708,32709],{"class":114,"line":5066},[112,32710,988],{"class":236},[112,32712,32713,32716],{"class":114,"line":9217},[112,32714,32715],{"class":122},"    \"support\"",[112,32717,3888],{"class":236},[112,32719,32720,32723,32725,32728],{"class":114,"line":9225},[112,32721,32722],{"class":122},"      \"supportEmail\"",[112,32724,2335],{"class":236},[112,32726,32727],{"class":122},"\"support@example.com\"",[112,32729,288],{"class":236},[112,32731,32732,32735,32737,32740],{"class":114,"line":9237},[112,32733,32734],{"class":122},"      \"documentationUrl\"",[112,32736,2335],{"class":236},[112,32738,32739],{"class":122},"\"https://example.com/docs\"",[112,32741,288],{"class":236},[112,32743,32744,32747,32749,32752],{"class":114,"line":9248},[112,32745,32746],{"class":122},"      \"supportUrl\"",[112,32748,2335],{"class":236},[112,32750,32751],{"class":122},"\"https://example.com/support\"",[112,32753,288],{"class":236},[112,32755,32756,32759,32761],{"class":114,"line":9253},[112,32757,32758],{"class":122},"      \"supportPhone\"",[112,32760,2335],{"class":236},[112,32762,32763],{"class":122},"\"+18005555555\"\n",[112,32765,32766],{"class":114,"line":9261},[112,32767,3946],{"class":236},[112,32769,32770],{"class":114,"line":9267},[112,32771,1476],{"class":236},[112,32773,32774],{"class":114,"line":9272},[112,32775,584],{"class":236},[43,32777,32778],{},[46,32779,32780],{},"You can update those changes using following command in terminal.",[102,32782,32783],{"className":9951,"code":25926,"language":9953,"meta":107,"style":107},[109,32784,32785],{"__ignoreMap":107},[112,32786,32787],{"class":114,"line":115},[112,32788,25926],{"class":236},[43,32790,32791],{},[46,32792,32793],{},"When the code is uploaded successfully you can check that by going to following Development→ Project → Select your project.",[19,32795,32796],{},[1603,32797],{"alt":13589,"src":32798},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-12.png",[43,32800,32801],{},[46,32802,32803],{},"To check your scopes click on the project Component. It will show your app-hsmeta.json",[19,32805,32806],{},[1603,32807],{"alt":13589,"src":32808},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-13.png",[43,32810,32811],{},[46,32812,32813],{},"To get the client ID and Client Secret click on the Auth button in your project component.",[19,32815,32816],{},[1603,32817],{"alt":13589,"src":32818},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-14.png",[43,32820,32821],{},[46,32822,32823],{},"Paste the Client ID and Client Secret in the app.unified.to",[19,32825,32826],{},[1603,32827],{"alt":13589,"src":32828},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-15.png",[43,32830,32831],{},[46,32832,32833],{},"To get developer key goto Development→ keys → developer API key. If no keys are present than generate developer api key.",[19,32835,32836],{},[1603,32837],{"alt":13589,"src":32838},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-16.png",[43,32840,32841,32848],{},[46,32842,32843,32844,32847],{},"Paste that key in the ",[1614,32845,31750],{"href":11523,"rel":32846},[1618]," and click activate.",[46,32849,32850],{},"Goto Embedded components→ click on hubspot→ select your project→ click on approve.",[19,32852,32853],{},"Your Hubspot application is created.",[1558,32855,32856],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":107,"searchDepth":126,"depth":126,"links":32858},[],"Hubspot provides Free Developer Sandbox Account. You can create that from following link .",{"img":32861,"date":32862,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-icon.svg","2025-12-17T08:03:00.000Z","/guides/how_to_create_connection_with_hubspot",{"title":32248,"description":32859},"guides/how_to_create_connection_with_hubspot","18W12hV8lFT9Mp3Jy8uwg9F--C5E6n34hq3bqfVpm5k",{"id":32868,"title":32869,"body":32870,"description":33069,"extension":1576,"meta":33070,"navigation":271,"path":33073,"seo":33074,"stem":33075,"__hash__":33076},"guides/guides/how_to_customize_portal_urls_for_stripe_and_gocardless.md","How to customize portal URLs for Stripe and GoCardless",{"type":9,"value":32871,"toc":33061},[32872,32875,32877,32882,32885,32887,32889,32897,32901,32912,32915,32950,32954,32957,32984,32988,32991,33033,33047,33049,33058],[12,32873,32869],{"id":32874},"how-to-customize-portal-urls-for-stripe-and-gocardless",[16,32876],{},[19,32878,32879],{},[22,32880,32881],{},"November 13, 2024",[19,32883,32884],{},"This guide explains how to customize the portal URLs for Stripe and GoCardless contacts to control payment method flows and redirects. Portal URLs allow your customers to manage their payment methods and perform other operations through a dedicated UI.",[67,32886,13634],{"id":13633},[19,32888,13637],{},[72,32890,32891,32894],{},[46,32892,32893],{},"A basic understanding of the Unified API",[46,32895,32896],{},"An active integration with either Stripe or GoCardless",[67,32898,32900],{"id":32899},"understanding-portal-urls","Understanding portal URLs",[19,32902,32903,32904,32907,32908,32911],{},"When working with the ",[109,32905,32906],{},"accounting_contact"," object for Stripe and GoCardless integrations, each contact includes a ",[109,32909,32910],{},"portal_url"," field. This URL provides access to the contact's portal UI where they can perform various operations, such as managing payment methods.",[19,32913,32914],{},"For example, a typical response might look like:",[102,32916,32918],{"className":9951,"code":32917,"language":9953,"meta":107,"style":107},"{\n   \"id\": 77558,\n   \"portal_url\": \"\u003Chttps://api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal>\"\n}\n",[109,32919,32920,32924,32936,32946],{"__ignoreMap":107},[112,32921,32922],{"class":114,"line":115},[112,32923,2327],{"class":236},[112,32925,32926,32929,32931,32934],{"class":114,"line":126},[112,32927,32928],{"class":122},"   \"id\"",[112,32930,2335],{"class":236},[112,32932,32933],{"class":129},"77558",[112,32935,288],{"class":236},[112,32937,32938,32941,32943],{"class":114,"line":135},[112,32939,32940],{"class":122},"   \"portal_url\"",[112,32942,2335],{"class":236},[112,32944,32945],{"class":122},"\"\u003Chttps://api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal>\"\n",[112,32947,32948],{"class":114,"line":147},[112,32949,584],{"class":236},[67,32951,32953],{"id":32952},"customize-the-portal-url","Customize the portal URL",[19,32955,32956],{},"You can customize the portal URL's behaviour by appending specific query parameters to your API calls. The following parameters are available:",[43,32958,32959,32965],{},[46,32960,32961,32964],{},[109,32962,32963],{},"success_url"," (optional): Specifies where users should be redirected after completing their action",[46,32966,32967,32969,32970],{},[109,32968,2472],{}," (optional): Specifies the type of action the link is intended for. Available values:\n",[72,32971,32972,32978],{},[46,32973,32974,32977],{},[109,32975,32976],{},"portal",": Generates a standard portal UI link (default)",[46,32979,32980,32983],{},[109,32981,32982],{},"add_payment_method",": Generates a portal UI URL specifically for adding a new payment method",[35,32985,32987],{"id":32986},"add-a-payment-method-with-custom-redirect","Add a payment method with custom redirect",[19,32989,32990],{},"To create a URL that allows customers to add a payment method and redirects them upon completion:",[43,32992,32993,33011],{},[46,32994,32995,32996],{},"Start with the original portal URL from the contact object:",[102,32997,32999],{"className":9951,"code":32998,"language":9953,"meta":107,"style":107},"https://api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal\n",[109,33000,33001],{"__ignoreMap":107},[112,33002,33003,33006,33008],{"class":114,"line":115},[112,33004,33005],{"class":118},"https",[112,33007,171],{"class":236},[112,33009,33010],{"class":578},"//api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal\n",[46,33012,33013,33014,11338,33016,33018,33019],{},"Append the ",[109,33015,32963],{},[109,33017,2472],{}," parameters:",[102,33020,33022],{"className":9951,"code":33021,"language":9953,"meta":107,"style":107},"https://api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal?success_url=YOUR_REDIRECT_URL&type=add_payment_method\n",[109,33023,33024],{"__ignoreMap":107},[112,33025,33026,33028,33030],{"class":114,"line":115},[112,33027,33005],{"class":118},[112,33029,171],{"class":236},[112,33031,33032],{"class":578},"//api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal?success_url=YOUR_REDIRECT_URL&type=add_payment_method\n",[19,33034,33035,33036,11338,33038,33040,33041,33043,33044,634],{},"Note: Both ",[109,33037,32963],{},[109,33039,2472],{}," parameters are optional. If ",[109,33042,2472],{}," is not specified, the system defaults to ",[109,33045,33046],{},"type=portal",[67,33048,25945],{"id":25944},[72,33050,33051],{},[46,33052,33053],{},[1614,33054,33057],{"href":33055,"rel":33056},"https://docs.unified.to/accounting/contact/model",[1618],"Accounting contact object reference",[1558,33059,33060],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":107,"searchDepth":126,"depth":126,"links":33062},[33063,33064,33065,33068],{"id":13633,"depth":126,"text":13634},{"id":32899,"depth":126,"text":32900},{"id":32952,"depth":126,"text":32953,"children":33066},[33067],{"id":32986,"depth":135,"text":32987},{"id":25944,"depth":126,"text":25945},"This guide explains how to customize the portal URLs for Stripe and GoCardless contacts to control payment method flows and redirects. Portal URLs allow your...",{"img":33071,"date":33072,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_customize_portal_urls_for_stripe_and_gocardless-icon.png","2024-11-13T00:00:00.000Z","/guides/how_to_customize_portal_urls_for_stripe_and_gocardless",{"title":32869,"description":33069},"guides/how_to_customize_portal_urls_for_stripe_and_gocardless","DXap14LvEq8e-EOED82Ckby7gMWqfZBLqz4_lVXVE_I",{"id":33078,"title":33079,"body":33080,"description":33271,"extension":1576,"meta":33272,"navigation":271,"path":33275,"seo":33276,"stem":33277,"__hash__":33278},"guides/guides/how_to_filter_webhook_events.md","How to filter webhook events",{"type":9,"value":33081,"toc":33269},[33082,33085,33087,33092,33098,33109,33116,33119,33125,33131,33138,33144,33151,33259,33266],[12,33083,33079],{"id":33084},"how-to-filter-webhook-events",[16,33086],{},[19,33088,33089],{},[22,33090,33091],{},"July 24, 2024",[19,33093,33094,33095,33097],{},"Webhook filters allow you to only receive data about the events you care about. For instance, if you're subscribed to CRM Deal events from ActiveCampaign, you could filter by ",[109,33096,31982],{}," to receive data only about deals for a specific company.",[19,33099,33100,33101,33104,33105],{},"Please note that filters are only supported for ",[478,33102,33103],{},"virtual"," webhooks at this moment, with few exceptions (e.g. Box supports native webhook filtering). Read more about the differences between native and virtual webhooks here: ",[1614,33106,31822],{"href":33107,"rel":33108},"https://docs.unified.to/guides/understanding_virtual_webhooks",[1618],[19,33110,33111,33112,9571,33114,31999],{},"Filter availability varies by integration type and data model. To determine which filters are supported for a particular virtual webhook, refer to the 'List' section on the Feature Support page of the respective integration. Parameters that end in ",[109,33113,31996],{},[109,33115,2472],{},[19,33117,33118],{},"For example, this is the Feature Support list for CRM Deals by ActiveCampaign:",[19,33120,33121],{},[1603,33122],{"alt":33123,"src":33124},"CRM_Deal.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_filter_webhook_events-0.png",[19,33126,33127,33128,33130],{},"Notice that this data model supports virtual webhooks as specified under ‘Webhook.' Under ‘List Options', the parameter ",[109,33129,31982],{}," is shown, indicating that it is possible to use this as a filter.",[19,33132,33133,33134,33137],{},"When creating webhooks via the ",[1614,33135,1640],{"href":1638,"rel":33136},[1618]," web app, you can specify your filter parameters in the webhook creation form:",[19,33139,33140],{},[1603,33141],{"alt":33142,"src":33143},"Webhook_creation.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_filter_webhook_events-1.png",[19,33145,33146,33147,33150],{},"When creating a webhook programatically via our API, you can include ",[109,33148,33149],{},"filters"," in the payload with a string dictionary of values to filter by. For example, in Javascript:",[102,33152,33154],{"className":9951,"code":33153,"language":9953,"meta":107,"style":107},"const options = {\n  method: 'POST',\n  url: 'https://api.unified.to/unified/webhook',\n  headers: {\n    authorization: 'bearer YOUR_ACCESS_TOKEN'\n  },\n  data: {\n    filters: {\n      company_id: '12345',\n    },\n    // other payload data if needed\n  },\n};\n\nconst results = await axios.request(options);\n",[109,33155,33156,33166,33174,33183,33187,33195,33199,33204,33209,33219,33223,33228,33232,33236,33240],{"__ignoreMap":107},[112,33157,33158,33160,33162,33164],{"class":114,"line":115},[112,33159,277],{"class":229},[112,33161,14030],{"class":129},[112,33163,354],{"class":229},[112,33165,280],{"class":236},[112,33167,33168,33170,33172],{"class":114,"line":126},[112,33169,14039],{"class":236},[112,33171,18547],{"class":122},[112,33173,288],{"class":236},[112,33175,33176,33178,33181],{"class":114,"line":135},[112,33177,14049],{"class":236},[112,33179,33180],{"class":122},"'https://api.unified.to/unified/webhook'",[112,33182,288],{"class":236},[112,33184,33185],{"class":114,"line":147},[112,33186,14059],{"class":236},[112,33188,33189,33192],{"class":114,"line":202},[112,33190,33191],{"class":236},"    authorization: ",[112,33193,33194],{"class":122},"'bearer YOUR_ACCESS_TOKEN'\n",[112,33196,33197],{"class":114,"line":208},[112,33198,9512],{"class":236},[112,33200,33201],{"class":114,"line":291},[112,33202,33203],{"class":236},"  data: {\n",[112,33205,33206],{"class":114,"line":299},[112,33207,33208],{"class":236},"    filters: {\n",[112,33210,33211,33214,33217],{"class":114,"line":307},[112,33212,33213],{"class":236},"      company_id: ",[112,33215,33216],{"class":122},"'12345'",[112,33218,288],{"class":236},[112,33220,33221],{"class":114,"line":315},[112,33222,988],{"class":236},[112,33224,33225],{"class":114,"line":323},[112,33226,33227],{"class":578},"    // other payload data if needed\n",[112,33229,33230],{"class":114,"line":329},[112,33231,9512],{"class":236},[112,33233,33234],{"class":114,"line":341},[112,33235,13738],{"class":236},[112,33237,33238],{"class":114,"line":346},[112,33239,272],{"emptyLinePlaceholder":271},[112,33241,33242,33244,33246,33248,33250,33253,33256],{"class":114,"line":366},[112,33243,277],{"class":229},[112,33245,12799],{"class":129},[112,33247,354],{"class":229},[112,33249,539],{"class":229},[112,33251,33252],{"class":236}," axios.",[112,33254,33255],{"class":118},"request",[112,33257,33258],{"class":236},"(options);\n",[19,33260,33261,33262,634],{},"Review our complete guide on the webhook API here: ",[1614,33263,33265],{"href":14661,"rel":33264},[1618],"Create webhook subscriptions",[1558,33267,33268],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":33270},[],"Webhook filters allow you to only receive data about the events you care about. For instance, if you're subscribed to CRM Deal events from ActiveCampaign, you...",{"img":33273,"date":33274,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_filter_webhook_events-icon.png","2024-07-24T00:00:00.000Z","/guides/how_to_filter_webhook_events",{"title":33079,"description":33271},"guides/how_to_filter_webhook_events","S-BiqIG7_KV7FJ00iD6Vmrd_cvU-IpIlVdi6tEgeSoA",{"id":33280,"title":33281,"body":33282,"description":33423,"extension":1576,"meta":33424,"navigation":271,"path":33428,"seo":33429,"stem":33430,"__hash__":33431},"guides/guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide.md","How to get your ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key - Step-by-step guide",{"type":9,"value":33283,"toc":33421},[33284,33288,33290,33295,33298,33301,33371,33374,33394,33397,33408,33411,33414],[12,33285,33287],{"id":33286},"how-to-get-your-adp-workforce-now-oauth2-client-id-oauth2-client-secret-oauth2-pem-certificate-and-oauth2-private-key-step-by-step-guide","How to get your ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key: Step-by-step guide",[16,33289],{},[19,33291,33292],{},[22,33293,33294],{},"April 24, 2023",[19,33296,33297],{},"When connecting ADP Workforce Now to other platforms, authentication requires a Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key.",[19,33299,33300],{},"Follow these step-by-step instructions to generate one from your ADP Workforce Now account (or provide them to your customers if they need to connect their account).",[43,33302,33303,33313,33321,33329,33337,33340,33348,33351,33359,33362,33365],{},[46,33304,33305,33306,2251,33309,634],{},"Log into your ADP account and access the ADP API Central portal.  You will need the paid ",[109,33307,33308],{},"ADP API Central",[1614,33310,14563],{"href":33311,"rel":33312},"https://apps.adp.com/en-US/apps/410612",[1618],[46,33314,33315,33316,33318],{},"Select a project or create a new project",[17180,33317],{},[1603,33319],{"alt":107,"src":33320},"/images/guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide_0.md.png",[46,33322,33323,33324,33326],{},"Enter the project details.",[17180,33325],{},[1603,33327],{"alt":107,"src":33328},"/images/guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide_1.md.png",[46,33330,33331,33332,33334],{},"Select domain",[17180,33333],{},[1603,33335],{"alt":107,"src":33336},"/images/guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide_2.md.png",[46,33338,33339],{},"Inside the Production integration Page, select the most suitable option for you.",[46,33341,33342,33343,33345],{},"After creating a new Project, select Development Credentials",[17180,33344],{},[1603,33346],{"alt":107,"src":33347},"/images/guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide_3.md.png",[46,33349,33350],{},"This page will Provide the Client ID, Secret Key and Certificates",[46,33352,33353,33354,33356],{},"Select Manage Certificate to generate Certificate",[17180,33355],{},[1603,33357],{"alt":107,"src":33358},"/images/guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide_4.md.png",[46,33360,33361],{},"Fill out the form, which will provide the PEM Key required to create a connection.",[46,33363,33364],{},"The processing time for the certificate is few minutes. Generated Certificate will be required to create a connection.",[46,33366,33367,33368,33370],{},"If asked, select ",[109,33369,23333],{}," permission.",[19,33372,33373],{},"For Unified, you need to have access to the following APIS for your App:",[72,33375,33376,33379,33382,33385,33388,33391],{},[46,33377,33378],{},"Job Applications API",[46,33380,33381],{},"Job Applicants API",[46,33383,33384],{},"Job Requisitions API",[46,33386,33387],{},"Client Data - Validation Tables API",[46,33389,33390],{},"Worker Leaves API",[46,33392,33393],{},"Worker API",[19,33395,33396],{},"To add the API to your application scope, contact your ADP representative. Make sure you provide the following:",[72,33398,33399,33402,33405],{},[46,33400,33401],{},"Organization name",[46,33403,33404],{},"Application name",[46,33406,33407],{},"List of APIs to be added",[19,33409,33410],{},"Generating a ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[19,33412,33413],{},"Unified.to gives you options: deliver data via API, streaming webhooks, database sync, or even as MCP tools for AI agents. One integration layer that adapts to your architecture instead of forcing tradeoffs.",[19,33415,33416,33420],{},[1614,33417,28800],{"href":33418,"rel":33419},"https://calendly.com/d/cph9-g8n-jzg/connect-with-unified",[1618]," to see how we simplify integration delivery across 430 integrations and 27 categories.",{"title":107,"searchDepth":126,"depth":126,"links":33422},[],"When connecting ADP Workforce Now to other platforms, authentication requires a Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2...",{"img":33425,"date":33426,"tag":33427},"/images/guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide_icon.md.png","2023-04-24T19:31:00.000Z","OAuth2,HRIS","/guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide",{"title":33281,"description":33423},"guides/how_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide","6szAh_8noveE-LdHFTTaPX9z1QIjF1Ss47LOLt-1yok",{"id":33433,"title":33434,"body":33435,"description":33450,"extension":1576,"meta":33556,"navigation":271,"path":33559,"seo":33560,"stem":33561,"__hash__":33562},"guides/guides/how_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide.md","How to get your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret - Step-by-step guide",{"type":9,"value":33436,"toc":33554},[33437,33441,33443,33448,33451,33454,33460,33463,33542,33545,33548],[12,33438,33440],{"id":33439},"how-to-get-your-amazon-s3-aws-region-aws-s3-key-and-aws-s3-secret-step-by-step-guide","How to get your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret: Step-by-step guide",[16,33442],{},[19,33444,33445],{},[22,33446,33447],{},"December 22, 2023",[19,33449,33450],{},"Developers connecting to Amazon S3 will need an AWS Region, AWS S3 Key and AWS S3 Secret for authentication.",[19,33452,33453],{},"Here's how to generate, configure, and copy your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret so you can use it in your integration or share steps with your customers.",[12,33455,33457],{"id":33456},"generating-aws-access-key-id-and-secret-access-key",[478,33458,33459],{},"Generating AWS Access Key ID and Secret Access Key",[19,33461,33462],{},"You can easily access your AWS S3 account using a Access key and Secret Access key of your AWS account.",[43,33464,33465,33476,33491,33502,33505,33529],{},[46,33466,33467,33468,33471,33473],{},"If you don't have one already then go to your account and click on ",[478,33469,33470],{},"My Security Credentials",[17180,33472],{},[1603,33474],{"alt":107,"src":33475},"/images/guides/how_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide_0.md.png",[46,33477,33478,33479,33482,33483,33485,33488,33490],{},"Then select ",[478,33480,33481],{},"Access keys (access key ID and secret access key)"," section.",[17180,33484],{},[1603,33486],{"alt":107,"src":33487},"/images/guides/how_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide_1.md.png",[17180,33489],{},"There is an important notification on the section, which recommends you to create an IAM Role instead of creating root access keys.",[46,33492,33493,33494,33497,33499],{},"Click on ",[478,33495,33496],{},"Create New Access Key",[17180,33498],{},[1603,33500],{"alt":107,"src":33501},"/images/guides/how_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide_2.md.png",[46,33503,33504],{},"Download the Key pairs to your system for future use.",[46,33506,33493,33507,33512,33513,33518,33519,33524,33526],{},[22,33508,33509],{},[478,33510,33511],{},"Show Access key"," and you will get your ",[22,33514,33515],{},[478,33516,33517],{},"Access Key ID"," and ",[22,33520,33521],{},[478,33522,33523],{},"Secret Access Key.",[17180,33525],{},[1603,33527],{"alt":107,"src":33528},"/images/guides/how_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide_3.md.png",[46,33530,33531,33532,33518,33536,33541],{},"You need to use this ",[22,33533,33534],{},[478,33535,33517],{},[22,33537,33538],{},[478,33539,33540],{},"Secret Access Key"," to connect to your AWS connect and access the S3 bucket.",[19,33543,33544],{},"With your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret in hand, you're ready to connect. But managing keys, tokens, and refresh flows across every vendor quickly becomes a security risk.",[19,33546,33547],{},"Unified.to abstracts all of that behind a single, secure layer. We never store customer data, credentials are always under your control, and our permissioning model removes the risk of misconfigured scopes.",[19,33549,33550,33553],{},[1614,33551,28800],{"href":33418,"rel":33552},[1618]," to see how Unified keeps integrations real-time, compliant, and safe at scale.",{"title":107,"searchDepth":126,"depth":126,"links":33555},[],{"img":33557,"date":33558,"tag":3},"/images/guides/how_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide_icon.md.svg","2023-12-22T16:06:00.000Z","/guides/how_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide",{"title":33434,"description":33450},"guides/how_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide","4MRXcUNVJpRABblR9vcfez9yxepO8tVOHeG9NQaT940",{"id":33564,"title":33565,"body":33566,"description":33580,"extension":1576,"meta":33645,"navigation":271,"path":33648,"seo":33649,"stem":33650,"__hash__":33651},"guides/guides/how_to_get_your_ashby_api_key_step_by_step_guide.md","How to get your Ashby API Key - Step-by-step guide",{"type":9,"value":33567,"toc":33643},[33568,33572,33574,33578,33581,33584,33633,33636,33638],[12,33569,33571],{"id":33570},"how-to-get-your-ashby-api-key-step-by-step-guide","How to get your Ashby API Key: Step-by-step guide",[16,33573],{},[19,33575,33576],{},[22,33577,33294],{},[19,33579,33580],{},"Ashby supports authentication with an  API Key. To connect, you'll need to generate an secure API Key from your account settings.",[19,33582,33583],{},"This short guide shows you how to generate one—whether you're testing in your sandbox or helping customers connect their Ashby account.",[43,33585,33586,33589,33597,33600,33608,33622,33625],{},[46,33587,33588],{},"Sign in to Ashby and click \"Admin\" in the top navigation bar",[46,33590,33591,33592,33594],{},"Navigate to Integrations > API Keys",[17180,33593],{},[1603,33595],{"alt":107,"src":33596},"/images/guides/how_to_get_your_ashby_api_key_step_by_step_guide_0.md.png",[46,33598,33599],{},"Click + New in the upper right corner",[46,33601,33602,33603,33605],{},"Add a name for the new API Key, click Create API Key",[17180,33604],{},[1603,33606],{"alt":107,"src":33607},"/images/guides/how_to_get_your_ashby_api_key_step_by_step_guide_1.md.png",[46,33609,33610,33611,33613,33616,33618,33619,33621],{},"Set necessary API Scopes, e.g.",[17180,33612],{},[1603,33614],{"alt":107,"src":33615},"/images/guides/how_to_get_your_ashby_api_key_step_by_step_guide_2.md.png",[17180,33617],{},"To read Applications, you will also need the \"Offers\" READ permission.",[17180,33620],{},"To use Webhooks, you will also need the \"API Keys\" WRITE permission.",[46,33623,33624],{},"Click \"Save and Continue\"",[46,33626,33627,33628,33630],{},"Copy the API Key",[17180,33629],{},[1603,33631],{"alt":107,"src":33632},"/images/guides/how_to_get_your_ashby_api_key_step_by_step_guide_3.md.png",[19,33634,33635],{},"Generating a Ashby API Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[19,33637,33413],{},[19,33639,33640,33420],{},[1614,33641,28800],{"href":33418,"rel":33642},[1618],{"title":107,"searchDepth":126,"depth":126,"links":33644},[],{"img":33646,"date":33647,"tag":3},"/images/guides/how_to_get_your_ashby_api_key_step_by_step_guide_icon.md.png","2023-04-24T19:37:00.000Z","/guides/how_to_get_your_ashby_api_key_step_by_step_guide",{"title":33565,"description":33580},"guides/how_to_get_your_ashby_api_key_step_by_step_guide","6_H72Wv9uFicQaXytMLL8D9_OYTAMmNZlxnK1zn9Nms",{"id":33653,"title":33654,"body":33655,"description":33670,"extension":1576,"meta":33787,"navigation":271,"path":33790,"seo":33791,"stem":33792,"__hash__":33793},"guides/guides/how_to_get_your_brex_api_token_step_by_step_guide.md","How to get your Brex API token - Step-by-step guide",{"type":9,"value":33656,"toc":33783},[33657,33661,33663,33668,33671,33674,33680,33753,33759,33765,33768,33771,33774,33777],[12,33658,33660],{"id":33659},"how-to-get-your-brex-api-token-step-by-step-guide","How to get your Brex API token: Step-by-step guide",[16,33662],{},[19,33664,33665],{},[22,33666,33667],{},"March 21, 2025",[19,33669,33670],{},"If you're building an integration with Brex, you'll need an API token from your customer's Brex account to authenticate requests.",[19,33672,33673],{},"This guide shows you (or your customers) how to generate one from Brex's account settings.",[35,33675,33677],{"id":33676},"generate-a-user-token",[478,33678,33679],{},"Generate a user token",[43,33681,33682,33697,33707,33713,33726,33737,33745],{},[46,33683,33684,33685,33690,33691,33696],{},"Sign in to ",[1614,33686,33689],{"href":33687,"rel":33688},"https://dashboard.brex.com/",[1618],"dashboard.brex.com"," as an ",[1614,33692,33695],{"href":33693,"rel":33694},"https://developer.brex.com/docs/roles_permissions_scopes",[1618],"account admin or card admin"," .",[46,33698,33699,33700,33696],{},"Go to ",[1614,33701,33704],{"href":33702,"rel":33703},"https://dashboard.brex.com/settings/developer",[1618],[22,33705,33706],{},"Developer > Settings",[46,33708,33709,33710,33696],{},"Click ",[22,33711,33712],{},"Create Token",[46,33714,33715,33716,33720,33721,33723],{},"Create a name for your token that will help you identify it. Choose what level of data access you need for your application; these are the ",[1614,33717,33719],{"href":33693,"rel":33718},[1618],"scopes"," your token will have.",[17180,33722],{},[1603,33724],{"alt":107,"src":33725},"/images/guides/how_to_get_your_brex_api_token_step_by_step_guide_0.md.png",[46,33727,33728,33729,33696,33732,33734],{},"The next screen will confirm your previous selections. Make sure it looks good, then select ",[22,33730,33731],{},"Allow Access",[17180,33733],{},[1603,33735],{"alt":107,"src":33736},"/images/guides/how_to_get_your_brex_api_token_step_by_step_guide_1.md.png",[46,33738,33739,33740,33742],{},"Your token is now created. Copy and store the token securely. You won't be able to see it again.",[17180,33741],{},[1603,33743],{"alt":107,"src":33744},"/images/guides/how_to_get_your_brex_api_token_step_by_step_guide_2.md.png",[46,33746,33747,33748,33750],{},"Back on the developer page of your Brex dashboard, you should see your token listed now. As a security measure, part of the string is obfuscated. If you lose it, create a new one and replace the token.",[17180,33749],{},[1603,33751],{"alt":107,"src":33752},"/images/guides/how_to_get_your_brex_api_token_step_by_step_guide_3.md.png",[19,33754,33755,33758],{},[478,33756,33757],{},"Caution",": Your user token is private and should not be shared. Never check it into version control or save it somewhere publicly accessible. If your user token is compromised or leaked, make sure to revoke it.",[35,33760,33762],{"id":33761},"token-revocation-and-expiration",[478,33763,33764],{},"Token revocation and expiration",[19,33766,33767],{},"User tokens will expire if they are not used to make an API call for 90 days.",[19,33769,33770],{},"If your token is compromised, or you no longer need it, revoke the user token from the developer page in your Brex dashboard. Once revoked, any calls made with this token will immediately begin to fail.",[19,33772,33773],{},"You've now created your Brex API token - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[19,33775,33776],{},"Unified.to removes that overhead with unified objects that work across 430 APIs. Map once, launch everywhere. Your team ships features instead of debugging vendor-specific edge cases.",[19,33778,33779,33782],{},[1614,33780,28800],{"href":33418,"rel":33781},[1618]," to see how much faster you can launch customer integrations with Unified.to.",{"title":107,"searchDepth":126,"depth":126,"links":33784},[33785,33786],{"id":33676,"depth":135,"text":33679},{"id":33761,"depth":135,"text":33764},{"img":33788,"date":33789,"tag":3},"/images/guides/how_to_get_your_brex_api_token_step_by_step_guide_icon.md.png","2025-03-21T21:13:00.000Z","/guides/how_to_get_your_brex_api_token_step_by_step_guide",{"title":33654,"description":33670},"guides/how_to_get_your_brex_api_token_step_by_step_guide","IKEiRLwOhA_vZsI9JiCwUroFXiLzJs8DNF7_kNVbo4s",{"id":33795,"title":33796,"body":33797,"description":33811,"extension":1576,"meta":33849,"navigation":271,"path":33852,"seo":33853,"stem":33854,"__hash__":33855},"guides/guides/how_to_get_your_ceridian_dayforce_username_password_and_client_namespace_step_by_step_guide.md","How to get your Ceridian Dayforce Username, Password and Client Namespace - Step-by-step guide",{"type":9,"value":33798,"toc":33847},[33799,33803,33805,33809,33812,33815,33818,33832,33835,33838,33841],[12,33800,33802],{"id":33801},"how-to-get-your-ceridian-dayforce-username-password-and-client-namespace-step-by-step-guide","How to get your Ceridian Dayforce Username, Password and Client Namespace: Step-by-step guide",[16,33804],{},[19,33806,33807],{},[22,33808,33294],{},[19,33810,33811],{},"Developers connecting to Ceridian Dayforce will need an Username, Password and Client Namespace for authentication.",[19,33813,33814],{},"Here's how to generate, configure, and copy your Ceridian Dayforce Username, Password and Client Namespace so you can use it in your integration or share steps with your customers.",[19,33816,33817],{},"To get the Dayforce client namespace, follow these steps:",[43,33819,33820,33823,33826,33829],{},[46,33821,33822],{},"Log in to Dayforce.",[46,33824,33825],{},"Navigate to the \"Company\" tab.",[46,33827,33828],{},"Click on \"Settings\".",[46,33830,33831],{},"Under the \"General\" section, you should find the \"Client Namespace\" field. The value in this field is the Dayforce client namespace.",[19,33833,33834],{},"Getting your Ceridian Dayforce Username, Password and Client Namespace is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[19,33836,33837],{},"Unified.to is a real-time integration platform built to replace that work. Instead of building and maintaining 430 custom connectors, you get one secure, normalized API layer across 27 SaaS tools.",[19,33839,33840],{},"On top of that, our usage-based pricing scales cleanly with your product. No per-connection fees, no setup charges, and no lock-in—just infrastructure economics that grow with you.",[19,33842,33843,33846],{},[1614,33844,28800],{"href":33418,"rel":33845},[1618]," to discover how predictable integration costs should be.",{"title":107,"searchDepth":126,"depth":126,"links":33848},[],{"img":33850,"date":33851,"tag":3},"/images/guides/how_to_get_your_ceridian_dayforce_username_password_and_client_namespace_step_by_step_guide_icon.md.svg","2023-04-24T19:39:00.000Z","/guides/how_to_get_your_ceridian_dayforce_username_password_and_client_namespace_step_by_step_guide",{"title":33796,"description":33811},"guides/how_to_get_your_ceridian_dayforce_username_password_and_client_namespace_step_by_step_guide","Eg3bKSpERJhCyaW-tZzgJBmz1Z3bVHJiyljK8Q_A-08",{"id":33857,"title":33858,"body":33859,"description":33874,"extension":1576,"meta":33939,"navigation":271,"path":33942,"seo":33943,"stem":33944,"__hash__":33945},"guides/guides/how_to_get_your_crelate_api_key_step_by_step_guide.md","How to get your Crelate API key - Step-by-step guide",{"type":9,"value":33860,"toc":33937},[33861,33865,33867,33872,33875,33878,33883,33886,33892,33897,33904,33911,33916,33922,33927,33930,33932],[12,33862,33864],{"id":33863},"how-to-get-your-crelate-api-key-step-by-step-guide","How to get your Crelate API key: Step-by-step guide",[16,33866],{},[19,33868,33869],{},[22,33870,33871],{},"August 18, 2023",[19,33873,33874],{},"To access Crelate data or automate workflows through an integration, an API key is required.",[19,33876,33877],{},"This guide walks you through where to find it and how to set it up for development or end-customer use.",[19,33879,33880],{},[478,33881,33882],{},"Where Is My API Key?",[19,33884,33885],{},"Your API Key can be found in your Settings Tab under \"My Settings & Preferences\". You will have to enable your API Key. Once Your API is enabled, you will be presented with your API Key.",[19,33887,33888,33889],{},"If you ever need to regenerate a new API Key, you can do so by clicking \"Regenerate New Key\". However, please note: ",[478,33890,33891],{},"Any Change in API KEY (for instance generating a new key or turning API Access off) will result in any exsisting links with the old API key to fail.",[19,33893,33894],{},[478,33895,33896],{},"Managing API",[19,33898,33899,33900,33903],{},"If you would like to manage your API, you can do so by going into your settings and clicking API Management under (Advanced Settings). You will presented with a screen that will allow you to manage users who have turned on API Access. If you click on a user who has enabled their API, administrators will have the option of turning off API Access for that user. Administrators can do this by clicking \"Clear API Key\". ",[478,33901,33902],{},"Clearing the API key will cause any references to that API Key to fail and will turn off that users API access to that specific API key",". If that user would like API access again, they will have to regenerate another API key.",[19,33905,33906,33907,33910],{},"To start, select your navigation menu and select \"",[478,33908,33909],{},"Your Profile & Preferences","\"",[19,33912,33913],{},[1603,33914],{"alt":107,"src":33915},"/images/guides/how_to_get_your_crelate_api_key_step_by_step_guide_0.md.png",[19,33917,33918,33919],{},"Next, navigate to ",[478,33920,33921],{},"API Access",[19,33923,33924],{},[1603,33925],{"alt":107,"src":33926},"/images/guides/how_to_get_your_crelate_api_key_step_by_step_guide_1.md.png",[19,33928,33929],{},"You've now created your Crelate API key - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[19,33931,33776],{},[19,33933,33934,33782],{},[1614,33935,28800],{"href":33418,"rel":33936},[1618],{"title":107,"searchDepth":126,"depth":126,"links":33938},[],{"img":33940,"date":33941,"tag":3},"/images/guides/how_to_get_your_crelate_api_key_step_by_step_guide_icon.md.png","2023-08-18T14:28:00.000Z","/guides/how_to_get_your_crelate_api_key_step_by_step_guide",{"title":33858,"description":33874},"guides/how_to_get_your_crelate_api_key_step_by_step_guide","eI1APvKz9kchnomUSW4VT5M58n8589RdDBwodL2ai9M",{"id":33947,"title":33948,"body":33949,"description":33964,"extension":1576,"meta":34064,"navigation":271,"path":34067,"seo":34068,"stem":34069,"__hash__":34070},"guides/guides/how_to_get_your_dashlane_api_key_step_by_step_guide.md","How to get your Dashlane API Key - Step-by-step guide",{"type":9,"value":33950,"toc":34059},[33951,33955,33957,33962,33965,33968,33972,33982,33988,34047,34050,34053],[12,33952,33954],{"id":33953},"how-to-get-your-dashlane-api-key-step-by-step-guide","How to get your Dashlane API Key: Step-by-step guide",[16,33956],{},[19,33958,33959],{},[22,33960,33961],{},"March 26, 2025",[19,33963,33964],{},"When connecting Dashlane to other platforms, authentication requires an API Key.",[19,33966,33967],{},"Follow these step-by-step instructions to generate one from your Dashlane account (or provide them to your customers if they need to connect their account).",[67,33969,33971],{"id":33970},"generate-a-dashlane-api-key","Generate a Dashlane API key",[19,33973,33974,33975,33978,33979,634],{},"To access the Dashlane API endpoints, you'll need an API key. This key can be generated in two ways: directly through the ",[478,33976,33977],{},"Admin Console"," or the ",[478,33980,33981],{},"Dashlane CLI",[35,33983,33985],{"id":33984},"generate-an-api-key-using-dashlane-admin-console",[478,33986,33987],{},"Generate an API key using Dashlane Admin Console",[43,33989,33990,33995,34010,34021],{},[46,33991,33992,33993,33482],{},"Open the Admin Console and navigate to the ",[478,33994,9700],{},[46,33996,33997,33998,34001,34002,634,34005,34007],{},"Select ",[478,33999,34000],{},"Public API"," and then ",[478,34003,34004],{},"Create key",[17180,34006],{},[1603,34008],{"alt":107,"src":34009},"/images/guides/how_to_get_your_dashlane_api_key_step_by_step_guide_0.md.png",[46,34011,34012,34013,634,34016,34018],{},"Enter a name for the key and select ",[478,34014,34015],{},"Generate key",[17180,34017],{},[1603,34019],{"alt":107,"src":34020},"/images/guides/how_to_get_your_dashlane_api_key_step_by_step_guide_1.md.png",[46,34022,34023,34024,34026,34029,34030,34032,34037,34039,34042,34044],{},"Copy or download the bearer token. The bearer token will be used to authenticate and access the endpoints.",[17180,34025],{},[478,34027,34028],{},"Important",": Save your bearer token securely in a Secret on your vault, as it will only be displayed once.",[17180,34031],{},[1614,34033,34036],{"href":34034,"rel":34035},"https://support.dashlane.com/hc/articles/17020356625682",[1618],"Add and manage secrets in Dashlane",[17180,34038],{},[1603,34040],{"alt":107,"src":34041},"/images/guides/how_to_get_your_dashlane_api_key_step_by_step_guide_2.md.png",[17180,34043],{},[1603,34045],{"alt":107,"src":34046},"/images/guides/how_to_get_your_dashlane_api_key_step_by_step_guide_3.md.png",[19,34048,34049],{},"You've now retrieved your Dashlane API Key. That's one system covered—but scaling integrations one by one means repeating this process hundreds of times.",[19,34051,34052],{},"Unified.to handles this for you: 430 integrations out of the box, all with normalized schemas, real-time delivery, and Virtual Webhooks. No polling scripts, no retry logic, no maintenance backlog.",[19,34054,34055,34058],{},[1614,34056,28800],{"href":33418,"rel":34057},[1618]," to see how Unified cuts integration work from quarters to days.",{"title":107,"searchDepth":126,"depth":126,"links":34060},[34061],{"id":33970,"depth":126,"text":33971,"children":34062},[34063],{"id":33984,"depth":135,"text":33987},{"img":34065,"date":34066,"tag":3},"/images/guides/how_to_get_your_dashlane_api_key_step_by_step_guide_icon.md.png","2025-03-26T13:37:00.000Z","/guides/how_to_get_your_dashlane_api_key_step_by_step_guide",{"title":33948,"description":33964},"guides/how_to_get_your_dashlane_api_key_step_by_step_guide","dcBkm6hl3oFRL9O5-_KM324QVypGWfzZG26Ybeo1ILo",{"id":34072,"title":34073,"body":34074,"description":34089,"extension":1576,"meta":34164,"navigation":271,"path":34167,"seo":34168,"stem":34169,"__hash__":34170},"guides/guides/how_to_get_your_deel_access_token_step_by_step_guide.md","How to get your Deel Access Token - Step-by-step guide",{"type":9,"value":34075,"toc":34162},[34076,34080,34082,34087,34090,34093,34098,34109,34114,34123,34128,34152,34155,34157],[12,34077,34079],{"id":34078},"how-to-get-your-deel-access-token-step-by-step-guide","How to get your Deel Access Token: Step-by-step guide",[16,34081],{},[19,34083,34084],{},[22,34085,34086],{},"August 26, 2023",[19,34088,34089],{},"When connecting Deel to other platforms, authentication requires an Access Token.",[19,34091,34092],{},"Follow these step-by-step instructions to generate one from your Deel account (or provide them to your customers if they need to connect their account).",[19,34094,34095],{},[478,34096,34097],{},"Generating Access Tokens",[43,34099,34100,34106],{},[46,34101,34102,34103,634],{},"Navigate to ",[478,34104,34105],{},"Apps & Integrations > Developer Center",[46,34107,34108],{},"Select the type of Token, whether Organization or Personal. The former ties the keys to the whole organization while the latter ties the keys to an individual - token will expire once this person leaves the company.",[19,34110,34111],{},[1603,34112],{"alt":107,"src":34113},"/images/guides/how_to_get_your_deel_access_token_step_by_step_guide_0.md.png",[43,34115,34116],{},[46,34117,34118,34119,34122],{},"Add a token name and click on the ",[478,34120,34121],{},"Next"," button.",[19,34124,34125],{},[1603,34126],{"alt":107,"src":34127},"/images/guides/how_to_get_your_deel_access_token_step_by_step_guide_1.md.png",[43,34129,34130,34149],{},[46,34131,34132,34133,34136,34137,16564,34140,1046,34143,1046,34146],{},"In the popup, select the scopes for the access token and click ",[478,34134,34135],{},"Generate",".\n",[109,34138,34139],{},"people:read",[109,34141,34142],{},"organizations:read",[109,34144,34145],{},"payslips:read",[109,34147,34148],{},"time-off:read",[46,34150,34151],{},"Make sure to copy and save your newly generated token because you won't be able to see it again!",[19,34153,34154],{},"Generating a Deel Access Token is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[19,34156,33413],{},[19,34158,34159,33420],{},[1614,34160,28800],{"href":33418,"rel":34161},[1618],{"title":107,"searchDepth":126,"depth":126,"links":34163},[],{"img":34165,"date":34166,"tag":3},"/images/guides/how_to_get_your_deel_access_token_step_by_step_guide_icon.md.png","2023-08-26T17:09:00.000Z","/guides/how_to_get_your_deel_access_token_step_by_step_guide",{"title":34073,"description":34089},"guides/how_to_get_your_deel_access_token_step_by_step_guide","YWPGoAgVNY_GCoTcLHFQ1GgenGf3JPU9y0yDBZ_NafE",{"id":34172,"title":34173,"body":34174,"description":34188,"extension":1576,"meta":34240,"navigation":271,"path":34242,"seo":34243,"stem":34244,"__hash__":34245},"guides/guides/how_to_get_your_dialpad_api_key_step_by_step_guide.md","How to get your Dialpad API Key - Step-by-step guide",{"type":9,"value":34175,"toc":34238},[34176,34180,34182,34186,34189,34192,34195,34218,34225,34228,34231,34233],[12,34177,34179],{"id":34178},"how-to-get-your-dialpad-api-key-step-by-step-guide","How to get your Dialpad API Key: Step-by-step guide",[16,34181],{},[19,34183,34184],{},[22,34185,33294],{},[19,34187,34188],{},"Dialpad supports authentication with an  API Key. To connect, you'll need to generate an secure API Key from your account settings.",[19,34190,34191],{},"This short guide shows you how to generate one—whether you're testing in your sandbox or helping customers connect their Dialpad account.",[19,34193,34194],{},"To create and access your API key, you need to follow the below steps. Note that only Company Admins can create API keys on Dialpad.",[43,34196,34197,34200,34205,34208,34214],{},[46,34198,34199],{},"Navigate to Admin Settings > My Company > Authentication > API Keys",[46,34201,33997,34202],{},[478,34203,34204],{},"Add Key",[46,34206,34207],{},"Name your key and set the expiration terms",[46,34209,34210,34211],{},"Select desired ",[478,34212,34213],{},"Additional Scopes",[46,34215,33997,34216],{},[478,34217,31780],{},[19,34219,34220],{},[1614,34221,34224],{"href":34222,"rel":34223},"https://use.vg/wWKws7",[1618],"video",[19,34226,34227],{},"Note: API keys can only be created by Dialpad customers on the Pro and Enterprise plans, and you must be a Company Admin to create and access an API key.",[19,34229,34230],{},"You've now retrieved your Dialpad API Key. That's one system covered—but scaling integrations one by one means repeating this process hundreds of times.",[19,34232,34052],{},[19,34234,34235,34058],{},[1614,34236,28800],{"href":33418,"rel":34237},[1618],{"title":107,"searchDepth":126,"depth":126,"links":34239},[],{"img":34241,"date":33851,"tag":3},"/images/guides/how_to_get_your_dialpad_api_key_step_by_step_guide_icon.md.png","/guides/how_to_get_your_dialpad_api_key_step_by_step_guide",{"title":34173,"description":34188},"guides/how_to_get_your_dialpad_api_key_step_by_step_guide","x21WZtDFrSsY4sHKvqQIGx3VBxVw04znm9s643b-oO0",{"id":34247,"title":17143,"body":34248,"description":34534,"extension":1576,"meta":34535,"navigation":271,"path":34538,"seo":34539,"stem":34540,"__hash__":34541},"guides/guides/how_to_get_your_discord_oauth_2_credentials_and_bot_token.md",{"type":9,"value":34249,"toc":34526},[34250,34253,34255,34260,34263,34267,34315,34324,34328,34331,34376,34380,34383,34425,34429,34432,34471,34475,34523],[12,34251,17143],{"id":34252},"how-to-get-your-discord-oauth-2-credentials-and-bot-token",[16,34254],{},[19,34256,34257],{},[22,34258,34259],{},"May 21, 2024",[19,34261,34262],{},"This guide explains how to register your application with Discord and obtain your OAuth 2 credentials and bot token. You'll need these credentials to activate the Discord integration and access Discord's APIs through our unified API.",[67,34264,34266],{"id":34265},"register-your-application-in-discord","Register your application in Discord",[72,34268,34269,34277,34289],{},[46,34270,34271,34272,634],{},"Sign into Discord and navigate to the ",[1614,34273,34276],{"href":34274,"rel":34275},"https://discord.com/developers/applications",[1618],"Developer Portal",[46,34278,9757,34279,34282,34283,34285],{},[478,34280,34281],{},"New Application"," at the top right of the page.",[17180,34284],{},[1603,34286],{"alt":34287,"src":34288},"discord_1.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-0.png",[46,34290,34291,34292,34295,34296],{},"In the ",[478,34293,34294],{},"Create an application"," window:",[72,34297,34298,34301,34304],{},[46,34299,34300],{},"Enter a name for your application",[46,34302,34303],{},"Check the box to agree to Discord's terms of service and developer policy",[46,34305,9757,34306,34309,34311],{},[478,34307,34308],{},"Create",[17180,34310],{},[1603,34312],{"alt":34313,"src":34314},"discord_2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-1.png",[43,34316,34317],{},[46,34318,34319,34320,34323],{},"Discord will create a new application, after which you will be taken to the ",[478,34321,34322],{},"General Information"," tab for your application's page.",[67,34325,34327],{"id":34326},"get-your-discord-oauth-2-credentials","Get your Discord OAuth 2 credentials",[19,34329,34330],{},"Once your application is registered, you can obtain its OAuth 2 credentials. These will be used to authenticate your app and access the Discord APIs.",[72,34332,34333,34340,34354,34363,34370],{},[46,34334,34335,34336,34339],{},"On your application's page, select the ",[478,34337,34338],{},"OAuth2"," tab from the left sidebar.",[46,34341,34342,34343,11338,34345,34347,34348,34350],{},"Make note of your ",[478,34344,30971],{},[478,34346,30976],{},". You'll need these later.",[17180,34349],{},[1603,34351],{"alt":34352,"src":34353},"discord_4.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-2.png",[46,34355,25422,34356,34359,34360,634],{},[478,34357,34358],{},"Redirects",", click ",[478,34361,34362],{},"Add Redirect",[46,34364,34365,34366,34369],{},"Enter ",[109,34367,34368],{},"https://api.unified.to/oauth/code"," as the redirect URL.",[46,34371,9757,34372,34375],{},[478,34373,34374],{},"Save changes"," at the bottom of the page.",[67,34377,34379],{"id":34378},"retrieve-your-discord-bot-token","Retrieve your Discord bot token",[19,34381,34382],{},"The Discord integration also requires a Bot Token to access the Discord API.",[43,34384,34385,34391,34400],{},[46,34386,12267,34387,34390],{},[478,34388,34389],{},"Bot"," from the left sidebar.",[46,34392,25422,34393,34396,34397,634],{},[478,34394,34395],{},"Build-A-Bot > Token,"," copy the ",[478,34398,34399],{},"Bot Token",[46,34401,34402,34403,34406,34408,34411],{},"If you don't see the token, click ",[478,34404,34405],{},"Reset Token.",[17180,34407],{},[1603,34409],{"alt":11593,"src":34410},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-3.png",[43,34412,34413,34419,34422],{},[46,34414,9757,34415,34418],{},[478,34416,34417],{},"Yes, do it!"," in the confirmation dialog.",[46,34420,34421],{},"Copy the new token that appears.",[46,34423,34424],{},"Note: You won't be able to view this token again, so store it securely.",[35,34426,34428],{"id":34427},"set-bot-permissions","Set bot permissions",[19,34430,34431],{},"If you plan to use specific Unified.to API endpoints, you'll need to enable certain bot permissions:",[43,34433,34434,34451,34466],{},[46,34435,34436,34437],{},"For listing guild members (using our HRIS List Employees API):",[72,34438,34439],{},[46,34440,34441,34442,34445,34446,34448],{},"Enable ",[478,34443,34444],{},"Server Members Intent"," under Privileged Gateway Intents",[17180,34447],{},[1603,34449],{"alt":11593,"src":34450},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-4.png",[46,34452,34453,34454],{},"For listing channels:",[72,34455,34456],{},[46,34457,34441,34458,34445,34461,34463],{},[478,34459,34460],{},"Message Content Intent",[17180,34462],{},[1603,34464],{"alt":11593,"src":34465},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-5.png",[46,34467,9757,34468,34375],{},[478,34469,34470],{},"Save Changes",[67,34472,34474],{"id":34473},"activate-discord-in-unifiedto","Activate Discord in Unified.to",[43,34476,34477,34482,34485,34518],{},[46,34478,9735,34479,31351],{},[1614,34480,9700],{"href":9741,"rel":34481},[1618],[46,34483,34484],{},"Find and click on the Discord integration card.",[46,34486,34487,34488],{},"On the integration details page:",[72,34489,34490,34495,34501,34507],{},[46,34491,12267,34492],{},[478,34493,34494],{},"Your OAuth 2 credentials.",[46,34496,34497,34498],{},"First, enter your Discord ",[478,34499,34500],{},"Client ID.",[46,34502,34503,34504],{},"Enter your Discord ",[478,34505,34506],{},"Client Secret.",[46,34508,34503,34509,34512,34514],{},[478,34510,34511],{},"Bot Token.",[17180,34513],{},[1603,34515],{"alt":34516,"src":34517},"discord_7.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-6.png",[46,34519,9757,34520,34522],{},[478,34521,9760],{}," to save your changes and enable the Discord integration.",[19,34524,34525],{},"You can now use the Unified API to create new experiences with Discord. Happy building!",{"title":107,"searchDepth":126,"depth":126,"links":34527},[34528,34529,34530,34533],{"id":34265,"depth":126,"text":34266},{"id":34326,"depth":126,"text":34327},{"id":34378,"depth":126,"text":34379,"children":34531},[34532],{"id":34427,"depth":135,"text":34428},{"id":34473,"depth":126,"text":34474},"This guide explains how to register your application with Discord and obtain your OAuth 2 credentials and bot token. You'll need these credentials to activate...",{"img":34536,"date":34537,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-icon.webp","2024-05-21T00:00:00.000Z","/guides/how_to_get_your_discord_oauth_2_credentials_and_bot_token",{"title":17143,"description":34534},"guides/how_to_get_your_discord_oauth_2_credentials_and_bot_token","pRwXvZRwQeMMlmat1fYBCaUWkdxGnMk51RSP47FI5Wk",{"id":34543,"title":34544,"body":34545,"description":34660,"extension":1576,"meta":34661,"navigation":271,"path":34664,"seo":34665,"stem":34666,"__hash__":34667},"guides/guides/how_to_get_your_elmo_client_id_and_client_secret_step_by_step_guide.md","How to get your ELMO client ID and client secret - Step-by-step guide",{"type":9,"value":34546,"toc":34658},[34547,34551,34553,34558,34561,34564,34569,34572,34586,34590,34648,34651,34653],[12,34548,34550],{"id":34549},"how-to-get-your-elmo-client-id-and-client-secret-step-by-step-guide","How to get your ELMO client ID and client secret: Step-by-step guide",[16,34552],{},[19,34554,34555],{},[22,34556,34557],{},"December 11, 2023",[19,34559,34560],{},"ELMO supports authentication with  client ID and client secret. To connect, you'll need to generate secure client ID and client secret from your account settings.",[19,34562,34563],{},"This short guide shows you how to generate one—whether you're testing in your sandbox or helping customers connect their ELMO account.",[19,34565,34566],{},[478,34567,34568],{},"Authentication Methods",[19,34570,34571],{},"ELMO uses three main credentials for API authentication:",[72,34573,34574,34580],{},[46,34575,34576,34579],{},[478,34577,34578],{},"Client ID:"," A unique identifier for your application.",[46,34581,34582,34585],{},[478,34583,34584],{},"Client Secret:"," A secure key used in conjunction with the Client ID.",[19,34587,34588],{},[478,34589,11728],{},[43,34591,34592,34602,34628],{},[46,34593,34594,34597,34598,34601],{},[478,34595,34596],{},"Request Access:"," Contact your ",[478,34599,34600],{},"ELMO Account Manager"," to confirm your organization has API access enabled.",[46,34603,34604,34607],{},[478,34605,34606],{},"Assign Permissions:",[72,34608,34609,34615,34625],{},[46,34610,34611,34612,634],{},"Log in to the ",[478,34613,34614],{},"ELMO Administration portal",[46,34616,34102,34617,34620,34621,34624],{},[478,34618,34619],{},"Security Profiles"," and add a profile with the ",[478,34622,34623],{},"API Access Manager","role.",[46,34626,34627],{},"Assign this profile to the specific user who will manage the integration.",[46,34629,34630,34633],{},[478,34631,34632],{},"Generate Credentials:",[72,34634,34635,34641],{},[46,34636,34637,34638,634],{},"Have a Company Admin access the ",[478,34639,34640],{},"API Management console",[46,34642,34643,34644,33518,34646,634],{},"Generate and securely record the ",[478,34645,30971],{},[478,34647,30976],{},[19,34649,34650],{},"You've now created your ELMO client ID and client secret - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[19,34652,33776],{},[19,34654,34655,33782],{},[1614,34656,28800],{"href":33418,"rel":34657},[1618],{"title":107,"searchDepth":126,"depth":126,"links":34659},[],"ELMO supports authentication with  client ID and client secret. To connect, you'll need to generate secure client ID and client secret from your account...",{"img":34662,"date":34663,"tag":3},"/images/guides/how_to_get_your_elmo_client_id_and_client_secret_step_by_step_guide_icon.md.png","2023-12-11T23:57:00.000Z","/guides/how_to_get_your_elmo_client_id_and_client_secret_step_by_step_guide",{"title":34544,"description":34660},"guides/how_to_get_your_elmo_client_id_and_client_secret_step_by_step_guide","h31pyYDDxgO8fzBRGUsWz1lmHMj9LZyAPzFn-E9w0vI",{"id":34669,"title":34670,"body":34671,"description":34769,"extension":1576,"meta":34770,"navigation":271,"path":34773,"seo":34774,"stem":34775,"__hash__":34776},"guides/guides/how_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide.md","How to get your Gainsight Client ID, Client Secret and Gainsight API Domain - Step-by-step guide",{"type":9,"value":34672,"toc":34767},[34673,34677,34679,34684,34687,34690,34693,34734,34737,34741,34752,34757,34760,34762],[12,34674,34676],{"id":34675},"how-to-get-your-gainsight-client-id-client-secret-and-gainsight-api-domain-step-by-step-guide","How to get your Gainsight Client ID, Client Secret and Gainsight API Domain: Step-by-step guide",[16,34678],{},[19,34680,34681],{},[22,34682,34683],{},"November 15, 2025",[19,34685,34686],{},"Gainsight supports authentication with  Client ID, Client Secret and Gainsight API Domain. To connect, you'll need to generate secure Client ID, Client Secret and Gainsight API Domain from your account settings.",[19,34688,34689],{},"This short guide shows you how to generate one—whether you're testing in your sandbox or helping customers connect their Gainsight account.",[19,34691,34692],{},"To generate the M2M OAuth key:",[43,34694,34695,34700,34706,34716,34723,34729],{},[46,34696,34102,34697,634],{},[478,34698,34699],{},"Administration > Connectors 2.0",[46,34701,33709,34702,34705],{},[478,34703,34704],{},"Create Connection",". The Create Connection dialog appears.",[46,34707,34708,34709,34712,34713,634],{},"From the ",[478,34710,34711],{},"Connector"," dropdown list, select ",[478,34714,34715],{},"Gainsight API",[46,34717,34718,34719,34722],{},"In the ",[478,34720,34721],{},"Name of the connection"," field, enter the name of the connection.",[46,34724,34718,34725,34728],{},[478,34726,34727],{},"Authentication Type",", select the OAuth.",[46,34730,33709,34731,634],{},[478,34732,34733],{},"Generate OAuth Credentials",[19,34735,34736],{},"New OAuth API Key and OAuth API Secret keys are generated, which you can copy and use for authentication in all of the REST API requests to Gainsight.",[19,34738,34739,171],{},[478,34740,13464],{},[72,34742,34743,34746,34749],{},[46,34744,34745],{},"M2M OAuth can be created and managed only by super admins.",[46,34747,34748],{},"M2M OAuth cannot be used for Event APIs.",[46,34750,34751],{},"Two different M2M connections cannot have the same name for a single connection.",[19,34753,34754],{},[1603,34755],{"alt":107,"src":34756},"/images/guides/how_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide_0.md.png",[19,34758,34759],{},"Generating a Gainsight Client ID, Client Secret and Gainsight API Domain is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[19,34761,33413],{},[19,34763,34764,33420],{},[1614,34765,28800],{"href":33418,"rel":34766},[1618],{"title":107,"searchDepth":126,"depth":126,"links":34768},[],"Gainsight supports authentication with  Client ID, Client Secret and Gainsight API Domain. To connect, you'll need to generate secure Client ID, Client Secret...",{"img":34771,"date":34772,"tag":3},"/images/guides/how_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide_icon.md.svg","2025-11-15T01:04:00.000Z","/guides/how_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide",{"title":34670,"description":34769},"guides/how_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide","t5l2W63Lrq5o_D7iadoLuHJ3AFHghXgpZjKnqgTFGhI",{"id":34778,"title":34779,"body":34780,"description":34794,"extension":1576,"meta":34924,"navigation":271,"path":34927,"seo":34928,"stem":34929,"__hash__":34930},"guides/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide.md","How to get your Greenhouse API Key and Job board token - Step-by-step guide",{"type":9,"value":34781,"toc":34922},[34782,34786,34788,34792,34795,34798,34807,34812,34821,34826,34838,34843,34887,34892,34905,34910,34913,34915,34917],[12,34783,34785],{"id":34784},"how-to-get-your-greenhouse-api-key-and-job-board-token-step-by-step-guide","How to get your Greenhouse API Key and Job board token: Step-by-step guide",[16,34787],{},[19,34789,34790],{},[22,34791,33294],{},[19,34793,34794],{},"Developers connecting to Greenhouse will need an API Key and Job board token for authentication.",[19,34796,34797],{},"Here's how to generate, configure, and copy your Greenhouse API Key and Job board token so you can use it in your integration or share steps with your customers.",[43,34799,34800],{},[46,34801,34802,34803,34806],{},"To create a Greenhouse \"Harvest\" API key, click the Configure icon on your Greenhouse navigation bar and select \"",[22,34804,34805],{},"Dev Center","\" on the left.",[19,34808,34809],{},[1603,34810],{"alt":107,"src":34811},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_0.md.png",[43,34813,34814],{},[46,34815,34816,34817,34820],{},"Click \"",[22,34818,34819],{},"API Credential Management","\".",[19,34822,34823],{},[1603,34824],{"alt":107,"src":34825},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_1.md.png",[43,34827,34828],{},[46,34829,34816,34830,34833,34834,34837],{},[22,34831,34832],{},"Create New API Key","\", and select \"",[22,34835,34836],{},"Harvest","\" for the API Type.",[19,34839,34840],{},[1603,34841],{"alt":107,"src":34842},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_2.md.png",[43,34844,34845,34855,34866,34874,34877,34884],{},[46,34846,34816,34847,34820,34850,34852],{},[22,34848,34849],{},"Manage Permissions",[17180,34851],{},[1603,34853],{"alt":107,"src":34854},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_3.md.png",[46,34856,34857,34858,634,34861,34863],{},"Copy your Harvest API key to a secure location then click ",[22,34859,34860],{},"\"I have stored the API key\"",[17180,34862],{},[1603,34864],{"alt":107,"src":34865},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_4.md.png",[46,34867,34868,34869,34871],{},"Set Jobs, Job Posts, and Candidates, Applications, Scorecards permissions.",[17180,34870],{},[1603,34872],{"alt":107,"src":34873},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_5.md.png",[46,34875,34876],{},"Click Save",[46,34878,34879,34880,34883],{},"Optionally,  you can specify the job board token for your organization. Go to the \"",[22,34881,34882],{},"Configure Job Boards","\" page. (Configure gear icon > Job Boards & Posts)",[46,34885,34886],{},"Find and edit the job board. (Ellipsis icon > Edit Board Settings)",[19,34888,34889],{},[1603,34890],{"alt":107,"src":34891},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_6.md.png",[43,34893,34894],{},[46,34895,34896,34897,34900,34901,34904],{},"On the ",[22,34898,34899],{},"Edit Your Job Board"," page, find the ",[22,34902,34903],{},"URL"," section. Copy this value as this is the token.",[19,34906,34907],{},[1603,34908],{"alt":107,"src":34909},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_7.md.png",[19,34911,34912],{},"Getting your Greenhouse API Key and Job board token is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[19,34914,33837],{},[19,34916,33840],{},[19,34918,34919,33846],{},[1614,34920,28800],{"href":33418,"rel":34921},[1618],{"title":107,"searchDepth":126,"depth":126,"links":34923},[],{"img":34925,"date":34926,"tag":3},"/images/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide_icon.md.png","2023-04-24T19:41:00.000Z","/guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide",{"title":34779,"description":34794},"guides/how_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide","dKDmtkStDnsB0l4suRl7HfyAFn2NMr1olCq-yrsFPFY",{"id":34932,"title":34933,"body":34934,"description":34949,"extension":1576,"meta":34996,"navigation":271,"path":34999,"seo":35000,"stem":35001,"__hash__":35002},"guides/guides/how_to_get_your_helpscout_api_key_step_by_step_guide.md","How to get your Helpscout API Key - Step-by-step guide",{"type":9,"value":34935,"toc":34994},[34936,34940,34942,34947,34950,34953,34959,34964,34974,34979,34984,34987,34989],[12,34937,34939],{"id":34938},"how-to-get-your-helpscout-api-key-step-by-step-guide","How to get your Helpscout API Key: Step-by-step guide",[16,34941],{},[19,34943,34944],{},[22,34945,34946],{},"June 8, 2024",[19,34948,34949],{},"Developers connecting to Helpscout will need an API Key for authentication.",[19,34951,34952],{},"Here's how to generate, configure, and copy your Helpscout API Key so you can use it in your integration or share steps with your customers.",[19,34954,34955,34956,634],{},"To generate, view, or regenerate the API key, click the \"person\" icon on the top right of your account, next to the search, then click ",[478,34957,34958],{},"Your Profile",[19,34960,34961],{},[1603,34962],{"alt":107,"src":34963},"/images/guides/how_to_get_your_helpscout_api_key_step_by_step_guide_0.md.png",[19,34965,34966,34967,34969,34970,34973],{},"Next, click the ",[478,34968,26021],{}," link in the menu on the left and select ",[478,34971,34972],{},"API Keys"," tab",[19,34975,34976],{},[1603,34977],{"alt":107,"src":34978},"/images/guides/how_to_get_your_helpscout_api_key_step_by_step_guide_1.md.png",[19,34980,34981,34983],{},[478,34982,12467],{}," If you don't see an API key in your profile, that's because you haven't been granted the \"Docs: Create new, edit settings & Collections\" permission by the Account Owner or an Administrator.",[19,34985,34986],{},"Generating a Helpscout API Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[19,34988,33413],{},[19,34990,34991,33420],{},[1614,34992,28800],{"href":33418,"rel":34993},[1618],{"title":107,"searchDepth":126,"depth":126,"links":34995},[],{"img":34997,"date":34998,"tag":3},"/images/guides/how_to_get_your_helpscout_api_key_step_by_step_guide_icon.md.png","2024-06-08T05:44:00.000Z","/guides/how_to_get_your_helpscout_api_key_step_by_step_guide",{"title":34933,"description":34949},"guides/how_to_get_your_helpscout_api_key_step_by_step_guide","9myehN-bAjMGbev69sArBonW5Lq9ZDiD5fm4WlVzeo4",{"id":35004,"title":35005,"body":35006,"description":35020,"extension":1576,"meta":35285,"navigation":271,"path":35288,"seo":35289,"stem":35290,"__hash__":35291},"guides/guides/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps.md","How to get your HubSpot developer key and OAuth 2 credentials (Legacy Apps)",{"type":9,"value":35007,"toc":35275},[35008,35011,35013,35018,35021,35026,35030,35033,35050,35054,35057,35081,35085,35088,35100,35105,35156,35163,35169,35189,35193,35213,35217,35260,35262],[12,35009,35005],{"id":35010},"how-to-get-your-hubspot-developer-key-and-oauth-2-credentials-legacy-apps",[16,35012],{},[19,35014,35015],{},[22,35016,35017],{},"February 12, 2023",[19,35019,35020],{},"This guide will show you how to retrieve your OAuth 2 credentials and developer API key in HubSpot.",[19,35022,35023,35025],{},[478,35024,13464],{},": HubSpot allows you to create different types of apps - public and private. This guide is about public apps.",[67,35027,35029],{"id":35028},"register-a-hubspot-developer-account","Register a HubSpot Developer Account",[19,35031,35032],{},"First, you'll need to register for a free account on HubSpot if you haven't already.",[43,35034,35035,35042,35047],{},[46,35036,9926,35037,634],{},[1614,35038,35041],{"href":35039,"rel":35040},"https://developers.hubspot.com/get-started",[1618],"HubSpot Developers portal",[46,35043,9757,35044],{},[478,35045,35046],{},"Create App Developer Account.",[46,35048,35049],{},"Follow the onboarding to complete your account setup.",[67,35051,35053],{"id":35052},"get-your-hubspot-developer-api-key","Get your HubSpot Developer API key",[19,35055,35056],{},"Developer account API keys are separate from standard API keys - they can be used to manage subscriptions for webhooks and other HubSpot features.",[43,35058,35059,35067,35072,35075],{},[46,35060,35061,35062,634],{},"Inside the HubSpot developer dashboard, open the sidebar and click ",[1614,35063,35066],{"href":35064,"rel":35065},"https://app.hubspot.com/developer/47094559/applications",[1618],"Apps",[46,35068,9757,35069,634],{},[478,35070,35071],{},"Get HubSpot API key",[46,35073,35074],{},"Follow the instructions to create a Developer API key.",[46,35076,9757,35077,35080],{},[478,35078,35079],{},"Show key"," to reveal your key. You will need this for the final step.",[67,35082,35084],{"id":35083},"create-a-hubspot-app","Create a HubSpot app",[19,35086,35087],{},"A HubSpot app is a container for your integration settings and is where you'll create and find your OAuth 2 credentials.",[43,35089,35090],{},[46,35091,35092,35093,35096,35097],{},"On the Development page → Legacy Apps→ click ",[478,35094,35095],{},"Create Legacy App →"," Select ",[478,35098,35099],{},"Public App.",[19,35101,35102],{},[1603,35103],{"alt":13589,"src":35104},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-0.png",[43,35106,35107,35110,35115,35131,35150],{},[46,35108,35109],{},"Give your app a name and description.",[46,35111,17167,35112,31287],{},[478,35113,35114],{},"Auth",[46,35116,25422,35117,35120,35121,35125,35127],{},[478,35118,35119],{},"Redirect URLs,"," enter: ",[478,35122,35123],{},[109,35124,34368],{},[17180,35126],{},[1603,35128],{"alt":35129,"src":35130},"Screenshot_2024-08-16_at_3.41.50_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-1.png",[46,35132,25422,35133,35136,35137,35140,35141,35144,35146],{},[478,35134,35135],{},"Scopes,"," click ",[478,35138,35139],{},"Add new scopes"," and select the permissions that your application will require. For example, if your application reads Deals, then select ",[109,35142,35143],{},"crm.deal.read",[17180,35145],{},[1603,35147],{"alt":35148,"src":35149},"ba5f5e7e-5c03-49b4-8662-75d3a50f4f01.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-2.png",[46,35151,9757,35152,35155],{},[478,35153,35154],{},"Create app"," to finish setting up your app.",[67,35157,35159,35160,35162],{"id":35158},"optional-add-the-oauth-scope-to-your-app","(optional) Add the ",[109,35161,25544],{}," scope to your app",[19,35164,35165,35166,35168],{},"For apps created before April 2024, the ",[109,35167,25544],{}," scope may be missing from your app's auth settings. Apps created after this date have it on by default. This scope is required for the HubSpot integration to work.",[43,35170,35171,35178,35184],{},[46,35172,25422,35173,34359,35175],{},[478,35174,25481],{},[478,35176,35177],{},"Add new scope.",[46,35179,35180,35181,35183],{},"Search for ",[478,35182,25544],{}," and select it.",[46,35185,9757,35186,634],{},[478,35187,35188],{},"Update",[67,35190,35192],{"id":35191},"get-your-oauth-2-credentials","Get your OAuth 2 credentials",[43,35194,35195,35200],{},[46,35196,35197,35198,31287],{},"After creating your app, you will be redirected to the App Info tab. Click again on the ",[478,35199,35114],{},[46,35201,35202,35203,35206,35207,35209],{},"Your unique ",[478,35204,35205],{},"Client ID and Client secret"," will be displayed. You will need these for the next step.",[17180,35208],{},[1603,35210],{"alt":35211,"src":35212},"Screenshot_2024-08-16_at_3.52.29_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-3.png",[67,35214,35216],{"id":35215},"activate-the-hubspot-integration-in-unifiedto-with-your-client-id-and-secret","Activate the HubSpot integration in Unified.to with your client ID and secret",[43,35218,35219,35227,35247],{},[46,35220,35221,35222],{},"Open a new tab and navigate to ",[1614,35223,35226],{"href":35224,"rel":35225},"https://app.unified.to/integrations/hubspot",[1618],"the HubSpot integration in Unified.to",[46,35228,35229,35230],{},"You will need the following three pieces of information from the earlier steps:",[43,35231,35232,35236,35241],{},[46,35233,35234],{},[478,35235,30971],{},[46,35237,35238],{},[478,35239,35240],{},"Client secret",[46,35242,35243,35246],{},[478,35244,35245],{},"Developer API key"," from the developer dashboard",[46,35248,35249,35250,35253,35254,35256],{},"Copy and paste these values into their respective fields on the page. Make sure that ",[478,35251,35252],{},"Your OAuth 2 credentials"," is selected above.",[17180,35255],{},[1603,35257],{"alt":35258,"src":35259},"Screenshot_2024-08-16_at_4.19.04_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-4.png",[67,35261,25945],{"id":25944},[72,35263,35264,35269],{},[46,35265,35266],{},[1614,35267,25967],{"href":25965,"rel":35268},[1618],[46,35270,35271],{},[1614,35272,25318],{"href":35273,"rel":35274},"https://docs.unified.to/guides/how_to_configure_webhooks_in_hubspot",[1618],{"title":107,"searchDepth":126,"depth":126,"links":35276},[35277,35278,35279,35280,35282,35283,35284],{"id":35028,"depth":126,"text":35029},{"id":35052,"depth":126,"text":35053},{"id":35083,"depth":126,"text":35084},{"id":35158,"depth":126,"text":35281},"(optional) Add the oauth scope to your app",{"id":35191,"depth":126,"text":35192},{"id":35215,"depth":126,"text":35216},{"id":25944,"depth":126,"text":25945},{"img":35286,"date":35287,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-icon.png","2023-02-12T00:00:00.000Z","/guides/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps",{"title":35005,"description":35020},"guides/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps","RXpTcJRgMnwES5YCoV5G6hUnGJupb9iXdiJ8iddAcFE",{"id":35293,"title":35294,"body":35295,"description":35310,"extension":1576,"meta":35361,"navigation":271,"path":35364,"seo":35365,"stem":35366,"__hash__":35367},"guides/guides/how_to_get_your_humaans_api_key_step_by_step_guide.md","How to get your Humaans API Key - Step-by-step guide",{"type":9,"value":35296,"toc":35359},[35297,35301,35303,35308,35311,35314,35340,35349,35352,35354],[12,35298,35300],{"id":35299},"how-to-get-your-humaans-api-key-step-by-step-guide","How to get your Humaans API Key: Step-by-step guide",[16,35302],{},[19,35304,35305],{},[22,35306,35307],{},"November 14, 2023",[19,35309,35310],{},"When connecting Humaans to other platforms, authentication requires an API Key.",[19,35312,35313],{},"Follow these step-by-step instructions to generate one from your Humaans account (or provide them to your customers if they need to connect their account).",[43,35315,35316,35319,35322,35325,35328,35331,35334,35337],{},[46,35317,35318],{},"Log in to the Humaans Admin Dashboard",[46,35320,35321],{},"Go to Settings",[46,35323,35324],{},"Open API access tokens",[46,35326,35327],{},"Click Create new token",[46,35329,35330],{},"Give it a name (e.g. \"Unified.to\")",[46,35332,35333],{},"Copy the generated token",[46,35335,35336],{},"Paste it into the API Token field",[46,35338,35339],{},"Click Authorize",[19,35341,35342,35344,35345,35348],{},[478,35343,12467],{}," You'll need ",[478,35346,35347],{},"Admin access"," in Humaans to see \"API access tokens.\"",[19,35350,35351],{},"You've now retrieved your Humaans API Key. That's one system covered—but scaling integrations one by one means repeating this process hundreds of times.",[19,35353,34052],{},[19,35355,35356,34058],{},[1614,35357,28800],{"href":33418,"rel":35358},[1618],{"title":107,"searchDepth":126,"depth":126,"links":35360},[],{"img":35362,"date":35363,"tag":3},"/images/guides/how_to_get_your_humaans_api_key_step_by_step_guide_icon.md.png","2023-11-14T18:49:00.000Z","/guides/how_to_get_your_humaans_api_key_step_by_step_guide",{"title":35294,"description":35310},"guides/how_to_get_your_humaans_api_key_step_by_step_guide","Gcw_v7Sv0TacKzpdHtJk2FDKp3T857B3XgGy_2sGBOs",{"id":35369,"title":35370,"body":35371,"description":35385,"extension":1576,"meta":35503,"navigation":271,"path":35505,"seo":35506,"stem":35507,"__hash__":35508},"guides/guides/how_to_get_your_icims_api_username_api_password_and_customer_id_step_by_step_guide.md","How to get your iCIMS API Username, API Password and Customer ID - Step-by-step guide",{"type":9,"value":35372,"toc":35494},[35373,35377,35379,35383,35386,35389,35393,35396,35400,35403,35414,35418,35422,35442,35446,35449,35458,35462,35470,35474,35482,35485,35487,35489],[12,35374,35376],{"id":35375},"how-to-get-your-icims-api-username-api-password-and-customer-id-step-by-step-guide","How to get your iCIMS API Username, API Password and Customer ID: Step-by-step guide",[16,35378],{},[19,35380,35381],{},[22,35382,33294],{},[19,35384,35385],{},"When connecting iCIMS to other platforms, authentication requires a API Username, API Password and Customer ID.",[19,35387,35388],{},"Follow these step-by-step instructions to generate one from your iCIMS account (or provide them to your customers if they need to connect their account).",[12,35390,35392],{"id":35391},"how-to-get-your-icims-api-credentials","How to get your iCIMS API credentials",[19,35394,35395],{},"This guide explains how to obtain the required credentials for connecting iCIMS. You'll need to work with iCIMS support to get these credentials.",[67,35397,35399],{"id":35398},"required-credentials","Required credentials",[19,35401,35402],{},"To connect iCIMS, you'll need:",[72,35404,35405,35408,35411],{},[46,35406,35407],{},"Customer ID (your unique platform identifier)",[46,35409,35410],{},"API Username",[46,35412,35413],{},"API Password",[67,35415,35417],{"id":35416},"steps-to-obtain-your-credentials","Steps to obtain your credentials",[35,35419,35421],{"id":35420},"step-1-contact-icims-support","Step 1: Contact iCIMS support",[43,35423,35424,35427,35430],{},[46,35425,35426],{},"Reach out to your iCIMS account representative or support team",[46,35428,35429],{},"Request API access for integration purposes",[46,35431,35432,35433],{},"Specify that you need:\n",[72,35434,35435,35438,35440],{},[46,35436,35437],{},"Customer ID",[46,35439,35410],{},[46,35441,35413],{},[35,35443,35445],{"id":35444},"step-2-receive-your-credentials","Step 2: Receive your credentials",[19,35447,35448],{},"iCIMS support will provide you with:",[72,35450,35451,35454,35456],{},[46,35452,35453],{},"Your unique Customer ID",[46,35455,35410],{},[46,35457,35413],{},[35,35459,35461],{"id":35460},"step-3-verify-access","Step 3: Verify access",[43,35463,35464,35467],{},[46,35465,35466],{},"Once you receive your credentials, keep them in a secure location",[46,35468,35469],{},"Enter the credentials in the inputs on this page to create a connection to your iCIMS account",[67,35471,35473],{"id":35472},"important-notes","Important notes",[72,35475,35476,35479],{},[46,35477,35478],{},"These credentials must be provided by iCIMS support",[46,35480,35481],{},"The Customer ID is unique to your organization",[19,35483,35484],{},"Getting your iCIMS API Username, API Password and Customer ID is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[19,35486,33837],{},[19,35488,33840],{},[19,35490,35491,33846],{},[1614,35492,28800],{"href":33418,"rel":35493},[1618],{"title":107,"searchDepth":126,"depth":126,"links":35495},[35496,35497,35502],{"id":35398,"depth":126,"text":35399},{"id":35416,"depth":126,"text":35417,"children":35498},[35499,35500,35501],{"id":35420,"depth":135,"text":35421},{"id":35444,"depth":135,"text":35445},{"id":35460,"depth":135,"text":35461},{"id":35472,"depth":126,"text":35473},{"img":35504,"date":34926,"tag":3},"/images/guides/how_to_get_your_icims_api_username_api_password_and_customer_id_step_by_step_guide_icon.md.png","/guides/how_to_get_your_icims_api_username_api_password_and_customer_id_step_by_step_guide",{"title":35370,"description":35385},"guides/how_to_get_your_icims_api_username_api_password_and_customer_id_step_by_step_guide","IsGmoH7659rixeGH2Sy6mZ8rGALOIjd8KSvEJfXJr9A",{"id":35510,"title":35511,"body":35512,"description":35570,"extension":1576,"meta":35571,"navigation":271,"path":35574,"seo":35575,"stem":35576,"__hash__":35577},"guides/guides/how_to_get_your_jobdiva_client_id_username_email_and_password_step_by_step_guide.md","How to get your JobDiva Client ID, Username/email and Password - Step-by-step guide",{"type":9,"value":35513,"toc":35568},[35514,35518,35520,35524,35527,35530,35534,35537,35541,35544,35547,35558,35561,35563],[12,35515,35517],{"id":35516},"how-to-get-your-jobdiva-client-id-usernameemail-and-password-step-by-step-guide","How to get your JobDiva Client ID, Username/email and Password: Step-by-step guide",[16,35519],{},[19,35521,35522],{},[22,35523,33871],{},[19,35525,35526],{},"If you're building an integration with JobDiva, you'll need an Client ID, Username/email and Password from your customer's JobDiva account to authenticate requests.",[19,35528,35529],{},"This guide shows you (or your customers) how to generate one from JobDiva's account settings.",[12,35531,35533],{"id":35532},"obtain-a-jobdiva-client-id","Obtain a JobDiva Client ID",[19,35535,35536],{},"Contact JobDiva Support to obtain a Client ID to use for your integration.",[12,35538,35540],{"id":35539},"create-a-jobdiva-api-user","Create a JobDiva API User",[19,35542,35543],{},"A JobDiva admin must establish a dedicated API username and password.",[19,35545,35546],{},"In JobDiva:",[43,35548,35549,35552,35555],{},[46,35550,35551],{},"Navigate to Settings > My Team > Add User.",[46,35553,35554],{},"Add a new user.",[46,35556,35557],{},"Allow to access JobDiva API Calls permission for the user.",[19,35559,35560],{},"With your JobDiva Client ID, Username/email and Password in hand, you're ready to connect. But managing keys, tokens, and refresh flows across every vendor quickly becomes a security risk.",[19,35562,33547],{},[19,35564,35565,33553],{},[1614,35566,28800],{"href":33418,"rel":35567},[1618],{"title":107,"searchDepth":126,"depth":126,"links":35569},[],"If you're building an integration with JobDiva, you'll need an Client ID, Username/email and Password from your customer's JobDiva account to authenticate...",{"img":35572,"date":35573,"tag":3},"/images/guides/how_to_get_your_jobdiva_client_id_username_email_and_password_step_by_step_guide_icon.md.png","2023-08-18T15:07:00.000Z","/guides/how_to_get_your_jobdiva_client_id_username_email_and_password_step_by_step_guide",{"title":35511,"description":35570},"guides/how_to_get_your_jobdiva_client_id_username_email_and_password_step_by_step_guide","tdotDCEW_GZwdo2fBKB1egz_0-tDQklmBiN12xv89GM",{"id":35579,"title":35580,"body":35581,"description":35595,"extension":1576,"meta":35699,"navigation":271,"path":35702,"seo":35703,"stem":35704,"__hash__":35705},"guides/guides/how_to_get_your_jobvite_api_key_api_key_secret_and_email_step_by_step_guide.md","How to get your Jobvite API Key, API Key Secret and Email - Step-by-step guide",{"type":9,"value":35582,"toc":35694},[35583,35587,35589,35593,35596,35598,35602,35609,35616,35620,35659,35662,35665,35673,35678,35681,35684,35687,35689],[12,35584,35586],{"id":35585},"how-to-get-your-jobvite-api-key-api-key-secret-and-email-step-by-step-guide","How to get your Jobvite API Key, API Key Secret and Email: Step-by-step guide",[16,35588],{},[19,35590,35591],{},[22,35592,33871],{},[19,35594,35595],{},"To access Jobvite data or automate workflows through an integration, a API Key, API Key Secret and Email are required.",[19,35597,33877],{},[67,35599,35601],{"id":35600},"how-do-i-get-my-jobvite-api-key-and-secret","How do I get my Jobvite API key and secret?",[19,35603,35604,35605],{},"Your API key and secret are both provided by Jobvite's Customer Success team. To request API credentials, file a support ticket at:\n",[1614,35606,35607],{"href":35607,"rel":35608},"https://www.jobvite.com/support/submit-a-case/",[1618],[19,35610,35611,35612,35615],{},"(Note: you will need to be logged in to submit a case. If you don't see a button titled ",[478,35613,35614],{},"Submit a Request",", reach out to your account representative i.e. your Customer Success Manager or Account Manager)",[35,35617,35619],{"id":35618},"submit-a-ticket","Submit a ticket",[72,35621,35622,35629,35635],{},[46,35623,35624,35625,35628],{},"Select the ",[478,35626,35627],{},"issue type"," from the dropdown menu",[46,35630,35631,35632],{},"Add a ",[478,35633,35634],{},"Subject",[46,35636,35637,35638,35640,35641],{},"Add a detailed ",[478,35639,16567],{}," of the request:\n",[72,35642,35643,35649],{},[46,35644,35645,35648],{},[478,35646,35647],{},"API names"," that you want to grant access to",[46,35650,35651,35654,35655,35658],{},[478,35652,35653],{},"Email"," of a dedicated Jobvite user to determine that an update was made by the API and not an actual user. This email address needs to accept the Jobvite registration process. Assign the ",[478,35656,35657],{},"Administrator"," role to this user.",[19,35660,35661],{},"Alternatively, you may start a support chat (see bottom right corner of Help Center) to chat with their support team for guidance on retrieving an API Key.",[19,35663,35664],{},"Please make sure that Jobvite gives you access to:",[72,35666,35667,35670],{},[46,35668,35669],{},"New User module",[46,35671,35672],{},"Enable New Contact Details UI",[19,35674,35675],{},[478,35676,35677],{},"NOTE:",[19,35679,35680],{},"Please note that access to the Contacts API requires that the Jobvite Customer has enabled the Jobvite Engage product on their account. The contacts API is not supported for customers who have not enabled the Jobvite Engage product (additional fee required).",[19,35682,35683],{},"JobVite Contacts are required for access to Candidates.",[19,35685,35686],{},"You've now retrieved your Jobvite API Key, API Key Secret and Email. That's one system covered—but scaling integrations one by one means repeating this process hundreds of times.",[19,35688,34052],{},[19,35690,35691,34058],{},[1614,35692,28800],{"href":33418,"rel":35693},[1618],{"title":107,"searchDepth":126,"depth":126,"links":35695},[35696],{"id":35600,"depth":126,"text":35601,"children":35697},[35698],{"id":35618,"depth":135,"text":35619},{"img":35700,"date":35701,"tag":3},"/images/guides/how_to_get_your_jobvite_api_key_api_key_secret_and_email_step_by_step_guide_icon.md.png","2023-08-18T15:04:00.000Z","/guides/how_to_get_your_jobvite_api_key_api_key_secret_and_email_step_by_step_guide",{"title":35580,"description":35595},"guides/how_to_get_your_jobvite_api_key_api_key_secret_and_email_step_by_step_guide","KnAnMqRoxYQQUs5bpFkJo10DJSRIqlhcpPef9bbcmt4",{"id":35707,"title":35708,"body":35709,"description":35723,"extension":1576,"meta":35774,"navigation":271,"path":35777,"seo":35778,"stem":35779,"__hash__":35780},"guides/guides/how_to_get_your_lever_api_key_step_by_step_guide.md","How to get your Lever API Key - Step-by-step guide",{"type":9,"value":35710,"toc":35772},[35711,35715,35717,35721,35724,35727,35762,35765,35767],[12,35712,35714],{"id":35713},"how-to-get-your-lever-api-key-step-by-step-guide","How to get your Lever API Key: Step-by-step guide",[16,35716],{},[19,35718,35719],{},[22,35720,33294],{},[19,35722,35723],{},"When connecting Lever to other platforms, authentication requires an API Key.",[19,35725,35726],{},"Follow these step-by-step instructions to generate one from your Lever account (or provide them to your customers if they need to connect their account).",[43,35728,35729,35732,35740,35743,35751,35759],{},[46,35730,35731],{},"To generate API credentials, navigate to Settings > Integrations and API > API Credentials.",[46,35733,35734,35735,35737],{},"Click the Generate New Key button",[17180,35736],{},[1603,35738],{"alt":107,"src":35739},"/images/guides/how_to_get_your_lever_api_key_step_by_step_guide_0.md.png",[46,35741,35742],{},"Input a name for the key that reflects the service or integration that will be using the key",[46,35744,35745,35746,35748],{},"Under the 'Permissions' heading, select \"Select all\"",[17180,35747],{},[1603,35749],{"alt":107,"src":35750},"/images/guides/how_to_get_your_lever_api_key_step_by_step_guide_1.md.png",[46,35752,35753,35754,35756],{},"Click the Copy Key button next to the API key (which can be found next to the 'Key name' field).",[17180,35755],{},[1603,35757],{"alt":107,"src":35758},"/images/guides/how_to_get_your_lever_api_key_step_by_step_guide_2.md.png",[46,35760,35761],{},"Click done",[19,35763,35764],{},"Generating a Lever API Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[19,35766,33413],{},[19,35768,35769,33420],{},[1614,35770,28800],{"href":33418,"rel":35771},[1618],{"title":107,"searchDepth":126,"depth":126,"links":35773},[],{"img":35775,"date":35776,"tag":3},"/images/guides/how_to_get_your_lever_api_key_step_by_step_guide_icon.md.png","2023-04-24T19:42:00.000Z","/guides/how_to_get_your_lever_api_key_step_by_step_guide",{"title":35708,"description":35723},"guides/how_to_get_your_lever_api_key_step_by_step_guide","oc-0Y6RrnDOa7qJ5MJMwueow9CquKrkpTTcwN9iKRgY",{"id":35782,"title":35783,"body":35784,"description":35798,"extension":1576,"meta":35871,"navigation":271,"path":35874,"seo":35875,"stem":35876,"__hash__":35877},"guides/guides/how_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide.md","How to get your Loxo Agency slug, API Key and Agency ID - Step-by-step guide",{"type":9,"value":35785,"toc":35867},[35786,35790,35792,35796,35799,35802,35806,35809,35814,35817,35822,35825,35830,35834,35837,35842,35845,35857,35860,35862],[12,35787,35789],{"id":35788},"how-to-get-your-loxo-agency-slug-api-key-and-agency-id-step-by-step-guide","How to get your Loxo Agency slug, API Key and Agency ID: Step-by-step guide",[16,35791],{},[19,35793,35794],{},[22,35795,33871],{},[19,35797,35798],{},"If you're building an integration with Loxo, you'll need an Agency slug, API Key and Agency ID from your customer's Loxo account to authenticate requests.",[19,35800,35801],{},"This guide shows you (or your customers) how to generate one from Loxo's account settings.",[35,35803,35805],{"id":35804},"where-do-i-find-my-api-key","Where do I find my API Key?",[19,35807,35808],{},"To get your API Key, we'll need to go to Loxo. Once there, click on your profile icon and then Settings.",[19,35810,35811],{},[1603,35812],{"alt":107,"src":35813},"/images/guides/how_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide_0.md.png",[19,35815,35816],{},"In the Settings view, look for the API Keys card and click on it.",[19,35818,35819],{},[1603,35820],{"alt":107,"src":35821},"/images/guides/how_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide_1.md.png",[19,35823,35824],{},"In the API Keys view, click the Add button.",[19,35826,35827],{},[1603,35828],{"alt":107,"src":35829},"undefined",[35,35831,35833],{"id":35832},"how-can-i-get-my-agency-slug","How can I get my Agency Slug?",[19,35835,35836],{},"To get your agency slug, navigate to your agency's career page. You can find it under your profile's menu.",[19,35838,35839],{},[1603,35840],{"alt":107,"src":35841},"/images/guides/how_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide_3.md.png",[19,35843,35844],{},"On the Careers page, your agency slug will be the first part of the path, after the domain.",[19,35846,35847,35849,35850,35853,35854],{},[478,35848,11219],{},": ",[109,35851,35852],{},"https://app.loxo.co/weblime-consultants"," = ",[22,35855,35856],{},"weblime-consultants",[19,35858,35859],{},"You've now retrieved your Loxo Agency slug, API Key and Agency ID. That's one system covered—but scaling integrations one by one means repeating this process hundreds of times.",[19,35861,34052],{},[19,35863,35864,34058],{},[1614,35865,28800],{"href":33418,"rel":35866},[1618],{"title":107,"searchDepth":126,"depth":126,"links":35868},[35869,35870],{"id":35804,"depth":135,"text":35805},{"id":35832,"depth":135,"text":35833},{"img":35872,"date":35873,"tag":3},"/images/guides/how_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide_icon.md.png","2023-08-18T15:03:00.000Z","/guides/how_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide",{"title":35783,"description":35798},"guides/how_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide","tNDciAS-DWo_zHbD5dBHWkOnnWYbUJk609_UyC2bg68",{"id":35879,"title":35880,"body":35881,"description":35895,"extension":1576,"meta":36182,"navigation":271,"path":36185,"seo":36186,"stem":36187,"__hash__":36188},"guides/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide.md","How to get your Microsoft Active Directory / Entra ID Client ID, Client Secret and Tenant ID - Step-by-step guide",{"type":9,"value":35882,"toc":36175},[35883,35887,35889,35893,35896,35899,35903,35909,35912,35973,35979,35993,35998,36002,36011,36016,36019,36025,36034,36041,36044,36071,36077,36082,36088,36100,36106,36153,36157,36160,36165,36168,36170],[12,35884,35886],{"id":35885},"how-to-get-your-microsoft-active-directory-entra-id-client-id-client-secret-and-tenant-id-step-by-step-guide","How to get your Microsoft Active Directory / Entra ID Client ID, Client Secret and Tenant ID: Step-by-step guide",[16,35888],{},[19,35890,35891],{},[22,35892,33294],{},[19,35894,35895],{},"Developers connecting to Microsoft Active Directory / Entra ID will need an Client ID, Client Secret and Tenant ID for authentication.",[19,35897,35898],{},"Here's how to generate, configure, and copy your Microsoft Active Directory / Entra ID Client ID, Client Secret and Tenant ID so you can use it in your integration or share steps with your customers.",[12,35900,35902],{"id":35901},"microsoft-adentra-id-client-id-and-secret-authentication","Microsoft AD/Entra ID Client ID and Secret Authentication",[67,35904,35906],{"id":35905},"step-1-register-an-application",[478,35907,35908],{},"Step: 1 Register an application",[19,35910,35911],{},"Registering your application establishes a trust relationship between the 3rd-party application and the Microsoft identity platform. The trust is unidirectional: the application trusts the Microsoft identity platform, and not the other way around. Once created, the application object can't be moved between different tenants.",[43,35913,35914,35922,35932,35949,35955,35962],{},[46,35915,35916,35917,634],{},"Sign in to the ",[1614,35918,35921],{"href":35919,"rel":35920},"https://entra.microsoft.com/",[1618],"Microsoft Entra admin center",[46,35923,35924,35925,35927,35928,35931],{},"If you have access to multiple tenants, use the ",[478,35926,25570],{}," icon in the top menu to switch to the tenant in which you want to register the application from the ",[478,35929,35930],{},"Directories + subscriptions"," menu.",[46,35933,35934,35935,35938,35939,35938,35942,35945,35946,634],{},"Browse to ",[478,35936,35937],{},"Identity"," > ",[478,35940,35941],{},"Applications",[478,35943,35944],{},"App registrations"," and select ",[478,35947,35948],{},"New registration",[46,35950,35951,35952,35954],{},"Enter a display ",[478,35953,31622],{}," for the application.",[46,35956,35957,35958,35961],{},"Specify who can use the application in the ",[478,35959,35960],{},"Supported account types"," section",[46,35963,33997,35964,35967,35968,35970],{},[478,35965,35966],{},"Register"," to complete the initial app registration.",[17180,35969],{},[1603,35971],{"alt":107,"src":35972},"/images/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide_0.md.png",[19,35974,35975,35976,35978],{},"When registration finishes, the Microsoft Entra admin center displays the app registration's ",[478,35977,9690],{}," pane. On this page, the app was assigned values for:",[72,35980,35981,35987],{},[46,35982,35983,35986],{},[478,35984,35985],{},"Application (client) ID"," which uniquely identifies your application in the Microsoft cloud ecosystem, across all tenants.",[46,35988,35989,35992],{},[478,35990,35991],{},"Object ID"," which uniquely identifies your application in your tenant.",[19,35994,35995],{},[1603,35996],{"alt":107,"src":35997},"/images/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide_1.md.png",[67,35999,36001],{"id":36000},"step-2-generate-client-secret","Step 2: Generate Client Secret",[19,36003,36004,36005,36010],{},"Credentials are used by ",[1614,36006,36009],{"href":36007,"rel":36008},"https://learn.microsoft.com/en-us/entra/identity-platform/msal-client-applications",[1618],"confidential client applications"," that access a web API. Examples of confidential clients are web apps, other web APIs, or service-type and daemon-type applications. Credentials allow your application to authenticate as itself, requiring no interaction from a user at runtime.",[19,36012,36013],{},[1603,36014],{"alt":107,"src":36015},"/images/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide_2.md.png",[19,36017,36018],{},"For this case, go to the Client Secrets tab, to generate a new Client Secret. The generated secret's value will be the one that will be used in Unified's authentication process.",[67,36020,36022],{"id":36021},"step-3-configure-permissions-for-microsoft-graph",[478,36023,36024],{},"Step 3: Configure permissions for Microsoft Graph",[19,36026,36027,36028,36033],{},"Microsoft Graph exposes ",[1614,36029,36032],{"href":36030,"rel":36031},"https://learn.microsoft.com/en-us/graph/permissions-overview#application-permissions",[1618],"application permissions"," for apps that call Microsoft Graph with their own identity. These permissions always require administrator consent.",[19,36035,36036,36037,36040],{},"Preconfigure the application permissions the app needs when you register the app. An administrator can consent to these permissions either by using the ",[1614,36038,35921],{"href":35919,"rel":36039},[1618]," when they install the app in their organization, or you can provide a sign-up experience in the app through which administrators can consent to the permissions you configured. Once Microsoft Entra ID records the administrator consent, the app can request tokens without having to request consent again.",[19,36042,36043],{},"To configure application permissions for the app in the app registrations experience on the Microsoft Entra admin center, follow these steps:",[72,36045,36046,36056,36065],{},[46,36047,36048,36049,36052,36053,634],{},"On the application's ",[478,36050,36051],{},"API permissions"," page, choose ",[478,36054,36055],{},"Add a permission",[46,36057,33997,36058,36061,36062,634],{},[478,36059,36060],{},"Microsoft Graph"," > select ",[478,36063,36064],{},"Application permissions",[46,36066,34718,36067,36070],{},[478,36068,36069],{},"Select Permissions"," dialog, choose the permissions to configure to the app.",[19,36072,36073,36074,36076],{},"The following screenshot shows the ",[478,36075,36069],{}," dialog box for Microsoft Graph application permissions.",[19,36078,36079],{},[1603,36080],{"alt":107,"src":36081},"/images/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide_3.md.png",[67,36083,36085],{"id":36084},"step-4-grant-tenant-wide-admin-consent-in-enterprise-apps-pane",[478,36086,36087],{},"Step 4: Grant tenant-wide admin consent in Enterprise apps pane",[19,36089,36090,36091,36094,36095,634],{},"You can grant tenant-wide admin consent through the ",[478,36092,36093],{},"Enterprise applications"," pane if the application is already provisioned in your tenant. For example, an app could be provisioned in your tenant if at least one user consents to the application. For more information, see ",[1614,36096,36099],{"href":36097,"rel":36098},"https://learn.microsoft.com/en-us/entra/identity-platform/how-applications-are-added",[1618],"How and why applications are added to Microsoft Entra ID",[19,36101,36102,36103,36105],{},"To grant tenant-wide admin consent to an app listed in ",[478,36104,36093],{}," pane:",[43,36107,36108,36119,36130,36133,36147],{},[46,36109,35916,36110,36113,36114,634],{},[1614,36111,35921],{"href":35919,"rel":36112},[1618]," as at least a ",[1614,36115,36118],{"href":36116,"rel":36117},"https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference#cloud-application-administrator",[1618],"Cloud Application Administrator",[46,36120,35934,36121,35938,36124,35938,36127,634],{},[478,36122,36123],{},"Entra ID",[478,36125,36126],{},"Enterprise apps",[478,36128,36129],{},"All applications",[46,36131,36132],{},"Enter the name of the existing application in the search box, and then select the application from the search results.",[46,36134,33997,36135,36138,36139,634,36142,36144],{},[478,36136,36137],{},"Permissions"," under ",[478,36140,36141],{},"Security",[17180,36143],{},[1603,36145],{"alt":107,"src":36146},"/images/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide_4.md.png",[46,36148,36149,36150,634],{},"Carefully review the permissions that the application requires. If you agree with the permissions the application requires, select ",[478,36151,36152],{},"Grant admin consent",[67,36154,36156],{"id":36155},"step-5-setup-authentication-in-unified","Step 5: Setup Authentication in Unified",[19,36158,36159],{},"Setup the Authentication credentials in Unified using the client ID, and generated secret, along with the tenant ID",[19,36161,36162],{},[1603,36163],{"alt":107,"src":36164},"/images/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide_5.md.png",[19,36166,36167],{},"You've now created your Microsoft Active Directory / Entra ID Client ID, Client Secret and Tenant ID - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[19,36169,33776],{},[19,36171,36172,33782],{},[1614,36173,28800],{"href":33418,"rel":36174},[1618],{"title":107,"searchDepth":126,"depth":126,"links":36176},[36177,36178,36179,36180,36181],{"id":35905,"depth":126,"text":35908},{"id":36000,"depth":126,"text":36001},{"id":36021,"depth":126,"text":36024},{"id":36084,"depth":126,"text":36087},{"id":36155,"depth":126,"text":36156},{"img":36183,"date":36184,"tag":3},"/images/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide_icon.md.png","2023-04-24T19:43:00.000Z","/guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide",{"title":35880,"description":35895},"guides/how_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide","it-Kc2mJiRf_M2806DMqrzTRBmHJPvzOp8YWUggZ7bo",{"id":36190,"title":36191,"body":36192,"description":36403,"extension":1576,"meta":36404,"navigation":271,"path":36407,"seo":36408,"stem":36409,"__hash__":36410},"guides/guides/how_to_get_your_microsoft_azure_ad_oauth_2_credentials.md","How to get your Microsoft Azure AD OAuth 2 credentials",{"type":9,"value":36193,"toc":36397},[36194,36197,36199,36204,36207,36211,36280,36284,36349,36353,36387,36389,36394],[12,36195,36191],{"id":36196},"how-to-get-your-microsoft-azure-ad-oauth-2-credentials",[16,36198],{},[19,36200,36201],{},[22,36202,36203],{},"June 3, 2024",[19,36205,36206],{},"This guide will show you how to obtain your OAuth 2 credentials for Microsoft Azure Active Directory (Azure AD), which are also needed for other integrations in the Microsoft Azure ecosystem e.g. Outlook, Teams, and Dynamics.",[67,36208,36210],{"id":36209},"register-an-app-in-microsoft-azure-portal","Register an app in Microsoft Azure Portal",[43,36212,36213,36220,36231,36245],{},[46,36214,34102,36215],{},[1614,36216,36219],{"href":36217,"rel":36218},"https://portal.azure.com/",[1618],"Microsoft Azure Portal",[46,36221,35180,36222,35183,36225,36227],{},[478,36223,36224],{},"Azure Active Directory",[17180,36226],{},[1603,36228],{"alt":36229,"src":36230},"oidc-microsoft-1.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-0.png",[46,36232,36233,36234,25571,36236,36239,36241],{},"From the sidebar, under Manage, click ",[478,36235,35944],{},[478,36237,36238],{},"New registration.",[17180,36240],{},[1603,36242],{"alt":36243,"src":36244},"oidc-microsoft-2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-1.png",[46,36246,36247,36248,36274,36276],{},"Fill in the following form to register a new app:",[43,36249,36250,36253,36259,36270],{},[46,36251,36252],{},"Enter any name you'd like for your app.",[46,36254,33997,36255,36258],{},[478,36256,36257],{},"Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)"," to allow anyone to log in.",[46,36260,25422,36261,36264,36265],{},[478,36262,36263],{},"Redirect URI",", enter ",[1614,36266,36268],{"href":34368,"rel":36267},[1618],[109,36269,34368],{},[46,36271,9757,36272,634],{},[478,36273,35966],{},[17180,36275],{},[1603,36277],{"alt":36278,"src":36279},"oidc-microsoft-3.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-2.png",[67,36281,36283],{"id":36282},"get-your-client-id-and-client-secret","Get your client ID and client secret",[43,36285,36286,36294,36309,36325,36337],{},[46,36287,36288,36289,36291,36292,610],{},"After registering your app and on the resulting page, copy the ",[478,36290,30971],{}," (found next to ",[478,36293,35985],{},[46,36295,33493,36296,36299,36300,36303,36305],{},[478,36297,36298],{},"Add a certificate or secret"," (found next to ",[478,36301,36302],{},"Client credentials)",[17180,36304],{},[1603,36306],{"alt":36307,"src":36308},"oidc-microsoft-4.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-3.png",[46,36310,36311,36312,36315,36316,634,36319,36321],{},"Under ",[478,36313,36314],{},"Client secrets (0)",", click ",[478,36317,36318],{},"New client secret",[17180,36320],{},[1603,36322],{"alt":36323,"src":36324},"oidc-microsoft-5.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-4.png",[46,36326,9757,36327,36330,36331,36333],{},[478,36328,36329],{},"Add"," - do not change anything else in the dialog.",[17180,36332],{},[1603,36334],{"alt":36335,"src":36336},"oidc-microsoft-6.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-5.png",[46,36338,36339,36340,36343,36345],{},"On the next page, copy the ",[478,36341,36342],{},"Value",[17180,36344],{},[1603,36346],{"alt":36347,"src":36348},"oidc-microsoft-7.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-6.png",[67,36350,36352],{"id":36351},"enter-your-oauth-credentials-on-unifiedto","Enter your OAuth credentials on Unified.to",[43,36354,36355,36358,36368,36371,36379],{},[46,36356,36357],{},"Take note of your Microsoft client ID and client secret from the above steps",[46,36359,9926,36360,36363,36364],{},[1614,36361,31750],{"href":11523,"rel":36362},[1618]," and find the integration page for the Microsoft integration you are interested in e.g. ",[1614,36365,36366],{"href":36366,"rel":36367},"https://app.unified.to/integrations/microsoft_ad",[1618],[46,36369,36370],{},"Enter your client ID",[46,36372,36373,36374,36376],{},"Enter your client secret",[17180,36375],{},[1603,36377],{"alt":11593,"src":36378},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-7.png",[46,36380,36381,36382,36384],{},"Make sure that you enable the correct permission scopes for your application.",[17180,36383],{},[1603,36385],{"alt":11593,"src":36386},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-8.png",[67,36388,10128],{"id":10127},[19,36390,36391],{},[478,36392,36393],{},"I'm getting an 'invalid client secret' error",[19,36395,36396],{},"This error indicates a problem with the client ID and/or secret that you generated. Please ensure you copied the correct values to the integration settings page on Unified.to, or regenerate these credentials in Microsoft Azure Active Directory and then try again.",{"title":107,"searchDepth":126,"depth":126,"links":36398},[36399,36400,36401,36402],{"id":36209,"depth":126,"text":36210},{"id":36282,"depth":126,"text":36283},{"id":36351,"depth":126,"text":36352},{"id":10127,"depth":126,"text":10128},"This guide will show you how to obtain your OAuth 2 credentials for Microsoft Azure Active Directory (Azure AD), which are also needed for other integrations...",{"img":36405,"date":36406,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-icon.png","2024-06-03T00:00:00.000Z","/guides/how_to_get_your_microsoft_azure_ad_oauth_2_credentials",{"title":36191,"description":36403},"guides/how_to_get_your_microsoft_azure_ad_oauth_2_credentials","4tWFRprJD4qFOJGoLLUb_5VaA7AGDX9qludqg5vuV4s",{"id":36412,"title":36413,"body":36414,"description":36623,"extension":1576,"meta":36624,"navigation":271,"path":36626,"seo":36627,"stem":36628,"__hash__":36629},"guides/guides/how_to_get_your_oauth_2_credentials_for_gmail.md","How to get your OAuth 2 credentials for Gmail",{"type":9,"value":36415,"toc":36615},[36416,36419,36421,36425,36428,36435,36454,36458,36494,36498,36535,36539,36589,36593,36596],[12,36417,36413],{"id":36418},"how-to-get-your-oauth-2-credentials-for-gmail",[16,36420],{},[19,36422,36423],{},[22,36424,12840],{},[19,36426,36427],{},"To access Google services such as Gmail (a.k.a Google Mail) with the Unified API, you will need to generate and retrieve your OAuth 2 credentials in the Google Cloud Console.",[67,36429,36431,36432],{"id":36430},"create-or-select-a-project-on-google-cloud-console","Create or s",[478,36433,36434],{},"elect a project on Google Cloud Console",[43,36436,36437,36444],{},[46,36438,9735,36439,634],{},[1614,36440,36443],{"href":36441,"rel":36442},"https://console.cloud.google.com/",[1618],"Google Cloud Console",[46,36445,36446,36447],{},"From the top nav bar, select an existing project or create a new one.\n",[43,36448,36449],{},[46,36450,36451,36452,634],{},"If creating a new project, name it whatever you want and then click ",[478,36453,34308],{},[67,36455,36457],{"id":36456},"enable-apis-for-gmail","Enable APIs for Gmail",[43,36459,36460,36483,36489],{},[46,36461,36462,36463,2251,36466,36469,36477,36479],{},"Once the project is selected or created, open the left sidebar and then navigate to ",[478,36464,36465],{},"APIs and services >",[478,36467,36468],{},"Library",[43,36470,36471],{},[46,36472,36473,36474,36476],{},"Alternatively, you can search for ",[478,36475,36468],{}," from the top navbar.",[17180,36478],{},[1603,36480],{"alt":36481,"src":36482},"Screenshot_2024-09-09_at_9.56.18_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_gmail-0.png",[46,36484,35180,36485,36488],{},[478,36486,36487],{},"Gmail API"," and click on the matching search result.",[46,36490,9757,36491,634],{},[478,36492,36493],{},"Enable",[67,36495,36497],{"id":36496},"configure-your-oauth-consent-screen","Configure your OAuth consent screen",[43,36499,36500,36513,36528],{},[46,36501,36502,36503,634,36506],{},"Open the left sidebar and navigate to ",[478,36504,36505],{},"APIs and services > Credentials",[43,36507,36508],{},[46,36509,36473,36510,36476],{},[478,36511,36512],{},"Credentials",[46,36514,9757,36515,36518,36519,634,36522,36524],{},[478,36516,36517],{},"Create Credentials"," and then select ",[478,36520,36521],{},"OAuth client ID",[17180,36523],{},[1603,36525],{"alt":36526,"src":36527},"Screenshot_2024-09-09_at_10.17.01_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_gmail-1.png",[46,36529,36530,36531,36534],{},"You will be asked to configure the OAuth Consent Screen. Click ",[478,36532,36533],{},"Configure Consent Screen"," and go through the consent screen process.",[67,36536,36538],{"id":36537},"get-your-oauth-credentials","Get your Oauth credentials",[43,36540,36541,36552,36558,36566,36570,36578,36586],{},[46,36542,36543,36544,36546,36547,25591,36550,634],{},"After configuring your consent screen, return to the ",[478,36545,36512],{}," home page, click ",[478,36548,36549],{},"Create credentials,",[478,36551,36521],{},[46,36553,12267,36554,36557],{},[478,36555,36556],{},"Web application"," as the application type. Name your app whatever you want",[46,36559,25422,36560,36563,36564],{},[478,36561,36562],{},"Authorised redirect URIs,"," enter ",[109,36565,34368],{},[46,36567,9757,36568,634],{},[478,36569,34308],{},[46,36571,36572,36573,11338,36575,36577],{},"After creating your credentials, a dialog window will appear displaying your new ",[478,36574,30971],{},[478,36576,35240],{},". Make a note of these as you will need them for the next step.",[46,36579,36580,36581],{},"Navigate to the integration page for Gmail on Unified.to i.e ",[1614,36582,36585],{"href":36583,"rel":36584},"https://app.unified.to/integrations/googlemail?tab=auth",[1618],"https://app.unified.to/integrations/googlemail",[46,36587,36588],{},"Enter your client ID, client secret, and developer API key to activate the Gmail integration.",[67,36590,36592],{"id":36591},"set-your-oauth-2-reauthentication-policy","Set your Oauth 2 reauthentication policy",[19,36594,36595],{},"Make sure your OAuth2 Reauthentication policy is set correctly for the integration to function as expected.",[43,36597,36598,36601,36604],{},[46,36599,36600],{},"In the Google Workspace Admin Console, navigate to Menu > Security > Access and data control > Google Cloud session control.",[46,36602,36603],{},"On the left, select the organizational unit where you want to set session length.\nFor all users, select the top-level organizational unit. Initially, an organizational unit inherits the settings of its parent.",[46,36605,25422,36606,36609,36610,36612],{},[478,36607,36608],{},"Reauthentication policy",", select \"Never require reauthentication\"",[17180,36611],{},[1603,36613],{"alt":11593,"src":36614},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_gmail-2.png",{"title":107,"searchDepth":126,"depth":126,"links":36616},[36617,36619,36620,36621,36622],{"id":36430,"depth":126,"text":36618},"Create or select a project on Google Cloud Console",{"id":36456,"depth":126,"text":36457},{"id":36496,"depth":126,"text":36497},{"id":36537,"depth":126,"text":36538},{"id":36591,"depth":126,"text":36592},"To access Google services such as Gmail (a.k.a Google Mail) with the Unified API, you will need to generate and retrieve your OAuth 2 credentials in the Google...",{"img":36625,"date":13545,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_gmail-icon.svg","/guides/how_to_get_your_oauth_2_credentials_for_gmail",{"title":36413,"description":36623},"guides/how_to_get_your_oauth_2_credentials_for_gmail","V7KvaKz_kQwiN16Ji4GK00Y_-HXHluWd6EjnX1odgrU",{"id":36631,"title":36632,"body":36633,"description":37021,"extension":1576,"meta":37022,"navigation":271,"path":37025,"seo":37026,"stem":37027,"__hash__":37028},"guides/guides/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365.md","How to get your OAuth 2 credentials for Microsoft Dynamics 365",{"type":9,"value":36634,"toc":37012},[36635,36638,36640,36645,36648,36652,36655,36674,36682,36684,36687,36699,36703,36706,36782,36786,36858,36862,36975,36981,36997,37000,37002,37004],[12,36636,36632],{"id":36637},"how-to-get-your-oauth-2-credentials-for-microsoft-dynamics-365",[16,36639],{},[19,36641,36642],{},[22,36643,36644],{},"October 29, 2024",[19,36646,36647],{},"This guide explains how to obtain your OAuth 2.0 credentials and configure API permissions for Microsoft Dynamics 365 business applications in Microsoft Entra ID (formerly Azure Active Directory).",[67,36649,36651],{"id":36650},"background","Background",[19,36653,36654],{},"Business applications in Microsoft Dynamics 365 use Microsoft's identity platform, Entra ID, for secure authentication. By registering your application on it, you establish a trusted connection that allows Unified.to to access Dynamics 365 data through Microsoft Graph (Microsoft's gateway to data and intelligence in Microsoft 365) and other Microsoft APIs. This works through:",[72,36656,36657,36663,36669],{},[46,36658,36659,36662],{},[478,36660,36661],{},"Delegated access",": Your application acts on behalf of the signed-in user, with permissions granted by both the administrator and the user",[46,36664,36665,36668],{},[478,36666,36667],{},"OAuth 2.0 credentials",": These consist of a client ID (which identifies your application) and a client secret (which serves as your application's password)",[46,36670,36671,36673],{},[478,36672,36137],{},": Specific capabilities your application requests, which must be approved by an administrator",[19,36675,36676,36677],{},"For more information, see: ",[1614,36678,36681],{"href":36679,"rel":36680},"https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview",[1618],"What is the Microsoft identify platform?",[67,36683,13634],{"id":13633},[19,36685,36686],{},"Ensure you have:",[72,36688,36689,36696],{},[46,36690,36691,36692,610],{},"Access to the Microsoft Entra admin center (",[1614,36693,36695],{"href":35919,"rel":36694},[1618],"entra.microsoft.com",[46,36697,36698],{},"Administrator access to Microsoft Entra ID",[67,36700,36702],{"id":36701},"register-your-application","Register your application",[19,36704,36705],{},"You'll first need to register an application in the Microsoft Entra admin center. This process will provide you with a client ID and client secret.",[43,36707,36708,36714,36738],{},[46,36709,36710,36711],{},"Sign in to the ",[1614,36712,35921],{"href":35919,"rel":36713},[1618],[46,36715,36716,36717],{},"Navigate to the App registrations page",[72,36718,36719,36724,36728],{},[46,36720,12267,36721,36723],{},[478,36722,35941],{}," from the left sidebar",[46,36725,9757,36726],{},[478,36727,35944],{},[46,36729,9757,36730,36732,36734],{},[478,36731,35948],{},[17180,36733],{},[1603,36735],{"alt":36736,"src":36737},"Screenshot_2024-10-31_at_11.43.24_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-0.png",[46,36739,36740,36741],{},"Configure your application",[72,36742,36743,36746,36754,36772],{},[46,36744,36745],{},"Enter a meaningful name (i.e. your product name)",[46,36747,25422,36748,36750,36751],{},[478,36749,35960],{},", select ",[478,36752,36753],{},"Accounts in any organizational directory (Any Microsoft Entra ID directory - Multitenant)",[46,36755,34291,36756,36758,36759],{},[478,36757,36263],{}," section:",[72,36760,36761,36767],{},[46,36762,12267,36763,36766],{},[478,36764,36765],{},"Web"," as the platform",[46,36768,34365,36769,36771],{},[109,36770,34368],{}," as the redirect URI (or our EU URL)",[46,36773,9757,36774,36776,36778],{},[478,36775,35966],{},[17180,36777],{},[1603,36779],{"alt":36780,"src":36781},"Screenshot_2024-10-31_at_11.45.21_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-1.png",[67,36783,36785],{"id":36784},"get-your-microsoft-dynamics-365-client-id-and-secret","Get your Microsoft Dynamics 365 client ID and secret",[43,36787,36788,36807],{},[46,36789,36790,36791],{},"Retrieve your client ID",[72,36792,36793,36798],{},[46,36794,36795,36796],{},"On your application's overview page, locate the ",[478,36797,35985],{},[46,36799,36800,36801,36803],{},"Copy this value - this is your client ID",[17180,36802],{},[1603,36804],{"alt":36805,"src":36806},"Screenshot_2024-10-31_at_11.49.27_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-2.png",[46,36808,36809,36810],{},"Create a client secret",[72,36811,36812,36818,36831,36834,36837,36841],{},[46,36813,36814,36815],{},"In the left menu, select ",[478,36816,36817],{},"Certificates & secrets",[46,36819,25422,36820,34359,36823,36825,36827],{},[478,36821,36822],{},"Client secrets",[478,36824,36318],{},[17180,36826],{},[1603,36828],{"alt":36829,"src":36830},"Screenshot_2024-10-31_at_11.50.15_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-3.png",[46,36832,36833],{},"Provide a description (optional, but helpful for tracking)",[46,36835,36836],{},"Make sure that the expiration field is set to its maximum value",[46,36838,9757,36839],{},[478,36840,36329],{},[46,36842,36843,36844,36846,36847,36849,36853],{},"Immediately copy the secret ",[478,36845,36342],{}," (not the secret ID)",[17180,36848],{},[1603,36850],{"alt":36851,"src":36852},"Screenshot_2024-10-31_at_11.50.41_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-4.png",[72,36854,36855],{},[46,36856,36857],{},"Important: Store this value securely - you won't be able to view it again after leaving this page",[67,36859,36861],{"id":36860},"configure-dynamics-365-api-permissions","Configure Dynamics 365 API permissions",[43,36863,36864,36918],{},[46,36865,36866,36867],{},"Set up required permissions for Microsoft Graph. These will be used to obtain information about your users.",[72,36868,36869,36874,36878,36882,36888,36907],{},[46,36870,36871,36872],{},"In the left menu, click ",[478,36873,36051],{},[46,36875,9757,36876],{},[478,36877,36055],{},[46,36879,12267,36880],{},[478,36881,36060],{},[46,36883,36884,36885],{},"Choose ",[478,36886,36887],{},"Delegated permissions",[46,36889,36890,36891],{},"Search for and add the following OpenID permissions:",[72,36892,36893,36898,36902],{},[46,36894,36895],{},[109,36896,36897],{},"openid",[46,36899,36900],{},[109,36901,666],{},[46,36903,36904],{},[109,36905,36906],{},"offline_access",[46,36908,9757,36909,36912,36914],{},[478,36910,36911],{},"Add permissions",[17180,36913],{},[1603,36915],{"alt":36916,"src":36917},"Screenshot_2024-10-31_at_11.58.11_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-5.png",[46,36919,36920,36921],{},"Set up required permissions for the business application you are building under Microsoft Dynamics 365:",[72,36922,36923,36929,36956,36960,36971],{},[46,36924,36925,36926,36928],{},"From the API permissions screen, click ",[478,36927,36051],{}," again",[46,36930,25422,36931,36934,36935],{},[478,36932,36933],{},"More Microsoft APIs, s","elect the business application category you are building\n",[72,36936,36937,36947],{},[46,36938,36939,36940,36943,36944],{},"If you're using ",[478,36941,36942],{},"Dynamics Sales,"," then select ",[478,36945,36946],{},"Dynamics CRM",[46,36948,36939,36949,36952,36953],{},[478,36950,36951],{},"Dynamics Customer Engagement",", then select ",[478,36954,36955],{},"Customer Insights",[46,36957,36884,36958],{},[478,36959,36887],{},[46,36961,36962,36963],{},"Search for and add the following OpenID permissions:\n",[72,36964,36965],{},[46,36966,36967,36970],{},[109,36968,36969],{},"user_impersonation"," (required for basic access)",[46,36972,9757,36973],{},[478,36974,36911],{},[67,36976,36978],{"id":36977},"enter-your-microsoft-dynamics-365-credentials-on-unifiedto",[478,36979,36980],{},"Enter your Microsoft Dynamics 365  credentials on Unified.to",[43,36982,36983,36991,36994],{},[46,36984,11822,36985,36990],{},[1614,36986,36989],{"href":36987,"rel":36988},"https://app.unified.to/integrations/microsoftdynamics",[1618],"https://app.unified.to/integrations/"," and search for the integration you're using",[46,36992,36993],{},"Enter your client ID and client secret from the steps above",[46,36995,36996],{},"Save your changes",[19,36998,36999],{},"Congratulations, you can now use the Microsoft Dynamics 365 integration in your application.",[19,37001,20468],{},[67,37003,25945],{"id":25944},[72,37005,37006],{},[46,37007,37008],{},[1614,37009,10169],{"href":37010,"rel":37011},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_connections#how-to-troubleshoot-unhealthy-connections",[1618],{"title":107,"searchDepth":126,"depth":126,"links":37013},[37014,37015,37016,37017,37018,37019,37020],{"id":36650,"depth":126,"text":36651},{"id":13633,"depth":126,"text":13634},{"id":36701,"depth":126,"text":36702},{"id":36784,"depth":126,"text":36785},{"id":36860,"depth":126,"text":36861},{"id":36977,"depth":126,"text":36980},{"id":25944,"depth":126,"text":25945},"This guide explains how to obtain your OAuth 2.0 credentials and configure API permissions for Microsoft Dynamics 365 business applications in Microsoft Entra...",{"img":37023,"date":37024,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-icon.webp","2024-10-29T00:00:00.000Z","/guides/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365",{"title":36632,"description":37021},"guides/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365","Pp9f3bRuPs-UhjDHLpAqkVsZD2TSN9LVvPe2IULfhUQ",{"id":37030,"title":37031,"body":37032,"description":37226,"extension":1576,"meta":37227,"navigation":271,"path":37230,"seo":37231,"stem":37232,"__hash__":37233},"guides/guides/how_to_get_your_oauth_2_credentials_in_pipedrive.md","How to get your OAuth 2 credentials in PipeDrive",{"type":9,"value":37033,"toc":37219},[37034,37037,37039,37044,37047,37056,37058,37061,37071,37075,37095,37099,37144,37148,37182,37186],[12,37035,37031],{"id":37036},"how-to-get-your-oauth-2-credentials-in-pipedrive",[16,37038],{},[19,37040,37041],{},[22,37042,37043],{},"August 26, 2024",[19,37045,37046],{},"This guide explains how to create a public developer app in Pipedrive and obtain your OAuth 2 credentials. You'll need these credentials in order to authenticate your app with Unified.to.",[19,37048,37049],{},[22,37050,37051,37052,634],{},"Note: The state parameter is not automatically available in Marketplace Manager. To enable it for your app, please write to ",[1614,37053,37055],{"href":37054},"mailto:marketplace.devs@pipedrive.com","marketplace.devs@pipedrive.com",[67,37057,13634],{"id":13633},[19,37059,37060],{},"Before you create a developer app in Pipedrive, ensure:",[72,37062,37063],{},[46,37064,37065,37066,634],{},"You have a Pipedrive developer sandbox account. If you don't have one, sign up at ",[1614,37067,37070],{"href":37068,"rel":37069},"https://developers.pipedrive.com/",[1618],"Pipedrive's developer portal",[67,37072,37074],{"id":37073},"access-the-developer-hub","Access the Developer Hub",[43,37076,37077,37080,37083],{},[46,37078,37079],{},"Log in to your Pipedrive account.",[46,37081,37082],{},"Click on your profile name in the upper right corner of the top navigation bar.",[46,37084,12267,37085,37088,37089,37091],{},[478,37086,37087],{},"Developer Hub"," from the drop-down menu.",[17180,37090],{},[1603,37092],{"alt":37093,"src":37094},"Screenshot_2024-08-26_at_3.02.21_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_in_pipedrive-0.png",[67,37096,37098],{"id":37097},"create-a-pipedrive-public-app","Create a Pipedrive public app",[43,37100,37101,37107,37112,37134],{},[46,37102,9757,37103,37106],{},[478,37104,37105],{},"Create an app"," (or \"+ Create an app\" if you have existing apps).",[46,37108,12267,37109,634],{},[478,37110,37111],{},"Create public app",[46,37113,37114,37115,634,37118,37128,37130],{},"Fill in your app details under ",[478,37116,37117],{},"Basic info",[43,37119,37120],{},[46,37121,34291,37122,37125,37126],{},[478,37123,37124],{},"Callback URL"," field, enter: ",[109,37127,34368],{},[17180,37129],{},[1603,37131],{"alt":37132,"src":37133},"Screenshot_2024-08-26_at_3.06.15_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_in_pipedrive-1.png",[46,37135,9757,37136,37139,37140,37143],{},[478,37137,37138],{},"Save."," You will be redirected to the ",[478,37141,37142],{},"OAuth & access scopes"," page after your app is created.",[67,37145,37147],{"id":37146},"configure-scopes-and-get-your-oauth-2-credentials","Configure scopes and get your OAuth 2 credentials",[43,37149,37150,37162,37168,37178],{},[46,37151,37152,37153],{},"Select the scopes your app requires. Only choose scopes that are necessary for your app's functionality.\n",[43,37154,37155],{},[46,37156,37157,37158,37161],{},"For example, if you want to be notified about new or updated deals from Pipedrive, select ",[478,37159,37160],{},"Deals"," and choose whether you need read-only access or full (i.e. create, update, read, delete) access.",[46,37163,37164,37165,37167],{},"Scroll down to the ",[478,37166,30971],{}," section.",[46,37169,37170,37171,11338,37174,37177],{},"Here you'll find your ",[109,37172,37173],{},"client_id",[109,37175,37176],{},"client_secret",". Make a note of them as you will need it for the final step.",[46,37179,9757,37180,634],{},[478,37181,31780],{},[67,37183,37185],{"id":37184},"activate-the-pipedrive-integration-in-unifiedto-with-your-client-id-and-secret","Activate the Pipedrive integration in Unified.to with your client ID and secret",[43,37187,37188,37194,37207,37215],{},[46,37189,35221,37190],{},[1614,37191,37193],{"href":35224,"rel":37192},[1618],"the Pipedrive integration in Unified.to",[46,37195,37196,37197],{},"You will need the following two pieces of information from the earlier steps:\n",[43,37198,37199,37203],{},[46,37200,37201],{},[478,37202,30971],{},[46,37204,37205],{},[478,37206,35240],{},[46,37208,35249,37209,37211,37212,634],{},[478,37210,12281],{}," is selected under ",[478,37213,37214],{},"Authentication Method",[46,37216,9757,37217,634],{},[478,37218,9760],{},{"title":107,"searchDepth":126,"depth":126,"links":37220},[37221,37222,37223,37224,37225],{"id":13633,"depth":126,"text":13634},{"id":37073,"depth":126,"text":37074},{"id":37097,"depth":126,"text":37098},{"id":37146,"depth":126,"text":37147},{"id":37184,"depth":126,"text":37185},"This guide explains how to create a public developer app in Pipedrive and obtain your OAuth 2 credentials. You'll need these credentials in order to...",{"img":37228,"date":37229,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_in_pipedrive-icon.jpg","2024-08-26T00:00:00.000Z","/guides/how_to_get_your_oauth_2_credentials_in_pipedrive",{"title":37031,"description":37226},"guides/how_to_get_your_oauth_2_credentials_in_pipedrive","tb484zqAPh-GkPFPicpIWstzyWBqN1aK9l0I0xmTNSc",{"id":37235,"title":37236,"body":37237,"description":37252,"extension":1576,"meta":37286,"navigation":271,"path":37289,"seo":37290,"stem":37291,"__hash__":37292},"guides/guides/how_to_get_your_paycom_sid_username_and_token_password_step_by_step_guide.md","How to get your Paycom SID/Username and Token/Password - Step-by-step guide",{"type":9,"value":37238,"toc":37284},[37239,37243,37245,37250,37253,37255,37258,37272,37275,37277,37279],[12,37240,37242],{"id":37241},"how-to-get-your-paycom-sidusername-and-tokenpassword-step-by-step-guide","How to get your Paycom SID/Username and Token/Password: Step-by-step guide",[16,37244],{},[19,37246,37247],{},[22,37248,37249],{},"August 28, 2023",[19,37251,37252],{},"To access Paycom data or automate workflows through an integration, a SID/Username and Token/Password are required.",[19,37254,33877],{},[19,37256,37257],{},"Please request assistance from your Paycom Account Representative for the following items:",[43,37259,37260,37263,37266,37269],{},[46,37261,37262],{},"Enabling the REST API for your Paycom instance",[46,37264,37265],{},"Whitelisting your OrgChart server IP address",[46,37267,37268],{},"Creating an API Service User",[46,37270,37271],{},"Generating valid authentication credentials (SID and Token)",[19,37273,37274],{},"Getting your Paycom SID/Username and Token/Password is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[19,37276,33837],{},[19,37278,33840],{},[19,37280,37281,33846],{},[1614,37282,28800],{"href":33418,"rel":37283},[1618],{"title":107,"searchDepth":126,"depth":126,"links":37285},[],{"img":37287,"date":37288,"tag":3},"/images/guides/how_to_get_your_paycom_sid_username_and_token_password_step_by_step_guide_icon.md.png","2023-08-28T16:28:00.000Z","/guides/how_to_get_your_paycom_sid_username_and_token_password_step_by_step_guide",{"title":37236,"description":37252},"guides/how_to_get_your_paycom_sid_username_and_token_password_step_by_step_guide","cgMeDjMvZbXxm6OUolN86Ur-hBXJQg-OOTFL2mG09Q4",{"id":37294,"title":37295,"body":37296,"description":37310,"extension":1576,"meta":37357,"navigation":271,"path":37360,"seo":37361,"stem":37362,"__hash__":37363},"guides/guides/how_to_get_your_pcrecruiter_username_password_and_database_id_step_by_step_guide.md","How to get your PCRecruiter Username, Password and Database ID - Step-by-step guide",{"type":9,"value":37297,"toc":37355},[37298,37302,37304,37308,37311,37314,37317,37343,37346,37348,37350],[12,37299,37301],{"id":37300},"how-to-get-your-pcrecruiter-username-password-and-database-id-step-by-step-guide","How to get your PCRecruiter Username, Password and Database ID: Step-by-step guide",[16,37303],{},[19,37305,37306],{},[22,37307,33871],{},[19,37309,37310],{},"Developers connecting to PCRecruiter will need an Username, Password and Database ID for authentication.",[19,37312,37313],{},"Here's how to generate, configure, and copy your PCRecruiter Username, Password and Database ID so you can use it in your integration or share steps with your customers.",[19,37315,37316],{},"To find your Database ID:",[43,37318,37319,37325,37331,37337],{},[46,37320,11822,37321,37324],{},[478,37322,37323],{},"System"," in the top navigation bar.",[46,37326,11822,37327,37330],{},[478,37328,37329],{},"API"," in the menu that opens.",[46,37332,11822,37333,37336],{},[478,37334,37335],{},"Api Settings"," under API.",[46,37338,37339,37340,634],{},"This will open a menu that displays the correct ",[478,37341,37342],{},"\"Api Database Id\"",[19,37344,37345],{},"Getting your PCRecruiter Username, Password and Database ID is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[19,37347,33837],{},[19,37349,33840],{},[19,37351,37352,33846],{},[1614,37353,28800],{"href":33418,"rel":37354},[1618],{"title":107,"searchDepth":126,"depth":126,"links":37356},[],{"img":37358,"date":37359,"tag":3},"/images/guides/how_to_get_your_pcrecruiter_username_password_and_database_id_step_by_step_guide_icon.md.png","2023-08-18T15:13:00.000Z","/guides/how_to_get_your_pcrecruiter_username_password_and_database_id_step_by_step_guide",{"title":37295,"description":37310},"guides/how_to_get_your_pcrecruiter_username_password_and_database_id_step_by_step_guide","k81PgqV0pqTaqwR0JVp8m8VauUd_8hRa-LX46S9d2WU",{"id":37365,"title":37366,"body":37367,"description":37435,"extension":1576,"meta":37436,"navigation":271,"path":37439,"seo":37440,"stem":37441,"__hash__":37442},"guides/guides/how_to_get_your_sap_successfactors_openid_connect_username_password_client_id_client_secret_dependency_name_ias_host_and_api_url_step_by_step_guide.md","How to get your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL - Step-by-step guide",{"type":9,"value":37368,"toc":37432},[37369,37373,37375,37380,37383,37385,37391,37422,37425,37427],[12,37370,37372],{"id":37371},"how-to-get-your-sap-successfactors-openid-connect-username-password-client-id-client-secret-dependency-name-ias-host-and-api-url-step-by-step-guide","How to get your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL: Step-by-step guide",[16,37374],{},[19,37376,37377],{},[22,37378,37379],{},"August 13, 2025",[19,37381,37382],{},"To access SAP SuccessFactors (OpenID Connect) data or automate workflows through an integration, a Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL are required.",[19,37384,33877],{},[67,37386,37388],{"id":37387},"procedure",[478,37389,37390],{},"Procedure",[43,37392,37393,37396],{},[46,37394,37395],{},"Sign into the administration console of your SAP Cloud Identity Services instance.",[46,37397,33699,37398,37401,37402,37401,37407,37401,37410,37401,37413,37416,37417,634],{},[478,37399,37400],{},"Applications and Resources"," ",[478,37403,37404],{},[112,37405,37406],{},"Your OIDC Application",[478,37408,37409],{},"Application APIs",[478,37411,37412],{},"Client Authentication",[478,37414,37415],{},"Secrets",", add a new secret. Once created, copy the client ID and secret for later use. Note that you won't be able to retrieve the secret from the system later. For more information, see ",[1614,37418,37421],{"href":37419,"rel":37420},"https://help.sap.com/docs/cloud-identity-services/aa08922a434a456ba44982c9f4f4d790/dev-configure-secrets-for-api-authentication",[1618],"Configure Secrets for API Authentication",[19,37423,37424],{},"You've now retrieved your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL. That's one system covered—but scaling integrations one by one means repeating this process hundreds of times.",[19,37426,34052],{},[19,37428,37429,34058],{},[1614,37430,28800],{"href":33418,"rel":37431},[1618],{"title":107,"searchDepth":126,"depth":126,"links":37433},[37434],{"id":37387,"depth":126,"text":37390},"To access SAP SuccessFactors (OpenID Connect) data or automate workflows through an integration, a Username, Password, Client ID, Client Secret, Dependency...",{"img":37437,"date":37438,"tag":3},"/images/guides/how_to_get_your_sap_successfactors_openid_connect_username_password_client_id_client_secret_dependency_name_ias_host_and_api_url_step_by_step_guide_icon.md.png","2025-08-13T14:27:00.000Z","/guides/how_to_get_your_sap_successfactors_openid_connect_username_password_client_id_client_secret_dependency_name_ias_host_and_api_url_step_by_step_guide",{"title":37366,"description":37435},"guides/how_to_get_your_sap_successfactors_openid_connect_username_password_client_id_client_secret_dependency_name_ias_host_and_api_url_step_by_step_guide","r1ii0UmPcX75dWbF38jAs0H5zfE3zb7uSVNnutffLsQ",{"id":37444,"title":37445,"body":37446,"description":37460,"extension":1576,"meta":37597,"navigation":271,"path":37600,"seo":37601,"stem":37602,"__hash__":37603},"guides/guides/how_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide.md","How to get your SAP SuccessFactors Username, Company ID, Password and API URL - Step-by-step guide",{"type":9,"value":37447,"toc":37592},[37448,37452,37454,37458,37461,37464,37467,37471,37494,37498,37507,37512,37544,37548,37582,37585,37587],[12,37449,37451],{"id":37450},"how-to-get-your-sap-successfactors-username-company-id-password-and-api-url-step-by-step-guide","How to get your SAP SuccessFactors Username, Company ID, Password and API URL: Step-by-step guide",[16,37453],{},[19,37455,37456],{},[22,37457,33294],{},[19,37459,37460],{},"When connecting SAP SuccessFactors to other platforms, authentication requires a Username, Company ID, Password and API URL.",[19,37462,37463],{},"Follow these step-by-step instructions to generate one from your SAP SuccessFactors account (or provide them to your customers if they need to connect their account).",[19,37465,37466],{},"Please follow the following instructions to obtain your SAP SuccessFactors API credentials.",[67,37468,37470],{"id":37469},"step-1-find-your-api-server-url","Step 1: Find your API Server URL",[72,37472,37473],{},[46,37474,37475,37476,37480,37481,37485,37486,37489,37491],{},"Go to this ",[1614,37477,30863],{"href":37478,"rel":37479},"https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/93f95815070049ebaaff042d8322d518/af2b8d5437494b12be88fe374eba75b6.html#api-servers",[1618]," and find your data-center (DC).  Remember your API Server URL. For example, if your domain was ",[1614,37482,37483],{"href":37483,"rel":37484},"https://salesdemo2.successfactors.com",[1618],", search for ",[109,37487,37488],{},"salesdemo2",[17180,37490],{},[1603,37492],{"alt":107,"src":37493},"/images/guides/how_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide_0.md.png",[67,37495,37497],{"id":37496},"step-2-find-your-username-and-company-id","Step 2: Find your Username and Company ID",[72,37499,37500],{},[46,37501,37502,37503,37506],{},"To find your SAP SuccessFactors ",[109,37504,37505],{},"username",", log-in to SuccessFactors, then click on your profile image in the upper-right corner to view your username.",[19,37508,37509],{},[1603,37510],{"alt":107,"src":37511},"/images/guides/how_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide_1.md.png",[72,37513,37514,37517,37533],{},[46,37515,37516],{},"You SHOULD create a new username/password just for API access so that you do not use your own login credentials.",[46,37518,37519,37520,37523,37524,37527,37528,37530],{},"To find your ",[109,37521,37522],{},"Company ID",", you can click on ",[109,37525,37526],{},"Show version information"," in the top-right menu",[17180,37529],{},[1603,37531],{"alt":107,"src":37532},"/images/guides/how_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide_2.md.png",[46,37534,37535,37536,37538,37539,37541],{},"An alternate method to find your ",[109,37537,37522],{}," under the company settings",[17180,37540],{},[1603,37542],{"alt":107,"src":37543},"/images/guides/how_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide_3.md.png",[67,37545,37547],{"id":37546},"step-3-set-security-configuration","Step 3: Set Security Configuration",[72,37549,37550,37561],{},[46,37551,37552,37553,37556,37557,37560],{},"Set the ",[109,37554,37555],{},"Allow Admin to Access OData API through Basic Authentication"," permission in ",[109,37558,37559],{},"Admin Center > OData API Basic Authentication Configuration"," page.",[46,37562,37563,37564,2251,37567,2251,37570,37573,37574,37577,37578,37581],{},"If you require specific IP Addresses to access the SuccessFactors API, then use the following IP addresses: ",[109,37565,37566],{},"44.199.69.244",[109,37568,37569],{},"3.65.142.239",[109,37571,37572],{},"13.239.151.208",".  This is performed in the ",[109,37575,37576],{},"Admin Center > OData API Basic Authentication Configuration"," or the ",[109,37579,37580],{},"API Center > OData IP Allowlisting"," pages.",[19,37583,37584],{},"You've now created your SAP SuccessFactors Username, Company ID, Password and API URL - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[19,37586,33776],{},[19,37588,37589,33782],{},[1614,37590,28800],{"href":33418,"rel":37591},[1618],{"title":107,"searchDepth":126,"depth":126,"links":37593},[37594,37595,37596],{"id":37469,"depth":126,"text":37470},{"id":37496,"depth":126,"text":37497},{"id":37546,"depth":126,"text":37547},{"img":37598,"date":37599,"tag":3},"/images/guides/how_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide_icon.md.png","2023-04-24T19:44:00.000Z","/guides/how_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide",{"title":37445,"description":37460},"guides/how_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide","dJg3XxtoqG2F3gytm028nhQG4WnZp4DP5NXyj8L6hf4",{"id":37605,"title":37606,"body":37607,"description":37901,"extension":1576,"meta":37902,"navigation":271,"path":37905,"seo":37906,"stem":37907,"__hash__":37908},"guides/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide.md","How to get your Shopify Admin API access token and Store ID - Step-by-step guide",{"type":9,"value":37608,"toc":37892},[37609,37613,37615,37619,37622,37625,37629,37652,37661,37665,37694,37698,37727,37731,37747,37803,37809,37813,37853,37857,37882,37885,37887],[12,37610,37612],{"id":37611},"how-to-get-your-shopify-admin-api-access-token-and-store-id-step-by-step-guide","How to get your Shopify Admin API access token and Store ID: Step-by-step guide",[16,37614],{},[19,37616,37617],{},[22,37618,35307],{},[19,37620,37621],{},"If you're building an integration with Shopify, you'll need an Admin API access token and Store ID from your customer's Shopify account to authenticate requests.",[19,37623,37624],{},"This guide shows you (or your customers) how to generate one from Shopify's account settings.",[67,37626,37628],{"id":37627},"how-do-i-find-my-shopify-access-token-and-store-id","How do I find my Shopify access token and store ID?",[19,37630,37631,37632,2251,37634,2251,37637,2251,37640,2251,37642,2251,37645,2251,37647,37650],{},"Your access token and store ID can be found under ",[478,37633,25570],{},[22,37635,37636],{},">",[478,37638,37639],{},"Apps and sales channels",[22,37641,37636],{},[478,37643,37644],{},"Develop Apps",[22,37646,37636],{},[478,37648,37649],{},"Your_App",[22,37651,634],{},[19,37653,37654,37655,37660],{},"If you have not used access tokens in the Shopify admin before, this guide will walk you through how to do that as well as how to retrieve your unique store ID. Note: These instructions are adapted from the ",[1614,37656,37659],{"href":37657,"rel":37658},"https://help.shopify.com/en/manual/apps/app-types/custom-apps#get-the-api-credentials-for-a-custom-app",[1618],"Custom apps"," guide in Shopify.",[35,37662,37664],{"id":37663},"step-1-activate-custom-app-development","Step 1: Activate custom app development",[43,37666,37667,37678,37688],{},[46,37668,37669,37670,35938,37672,634],{},"In the Shopify admin dashboard, click ",[478,37671,25570],{},[1614,37673,37676],{"href":37674,"rel":37675},"https://admin.shopify.com/settings/apps",[1618],[478,37677,37639],{},[46,37679,33709,37680,634,37683,37685],{},[478,37681,37682],{},"Develop apps",[17180,37684],{},[1603,37686],{"alt":107,"src":37687},"/images/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide_0.md.png",[46,37689,37690,37691,634],{},"Read the disclaimer, and then click ",[478,37692,37693],{},"Allow custom app development",[35,37695,37697],{"id":37696},"step-2-create-a-custom-app","Step 2: Create a custom app",[43,37699,37700,37705,37723],{},[46,37701,37702,37703,634],{},"On the same page, click ",[478,37704,37105],{},[46,37706,37707,37708,37710,37711,37714,37715,37717,37718,37720],{},"In the modal that appears, enter the ",[478,37709,31205],{}," and select an ",[478,37712,37713],{},"App developer",". This can be the store owner or any collaborator with the ",[478,37716,37682],{}," permission.",[17180,37719],{},[1603,37721],{"alt":107,"src":37722},"/images/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide_1.md.png",[46,37724,33709,37725,634],{},[478,37726,35154],{},[35,37728,37730],{"id":37729},"step-3-configure-admin-api-scopes","Step 3: Configure Admin API scopes",[43,37732,37733,37744],{},[46,37734,37735,37736,37739,37741],{},"On the same page, click ",[478,37737,37738],{},"Configure Admin API scopes",[17180,37740],{},[1603,37742],{"alt":107,"src":37743},"/images/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide_2.md.png",[46,37745,37746],{},"Select all of the following checkboxes (tip: use the search bar to quickly look these up)",[72,37748,37749,37757,37768,37776,37787],{},[46,37750,37751,2251,37754],{},[478,37752,37753],{},"Customers:",[109,37755,37756],{},"read_customers",[46,37758,37759,2251,37762,1046,37765],{},[478,37760,37761],{},"Inventory:",[109,37763,37764],{},"read_inventory",[109,37766,37767],{},"write_inventory",[46,37769,37770,2251,37773],{},[478,37771,37772],{},"Locations:",[109,37774,37775],{},"read_locations",[46,37777,37778,2251,37781,1046,37784],{},[478,37779,37780],{},"Orders:",[109,37782,37783],{},"read_orders",[109,37785,37786],{},"write_orders",[46,37788,37789,2251,37792,1046,37795,37798,37800],{},[478,37790,37791],{},"Products:",[109,37793,37794],{},"read_products",[109,37796,37797],{},"write_products",[17180,37799],{},[1603,37801],{"alt":107,"src":37802},"/images/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide_3.md.png",[43,37804,37805],{},[46,37806,9757,37807],{},[478,37808,31780],{},[35,37810,37812],{"id":37811},"step-4-install-your-app-and-retrieve-the-access-token","Step 4: Install your app and retrieve the access token",[43,37814,37815,37828,37834,37842,37847],{},[46,37816,9735,37817,25472,37820,37823,37825],{},[478,37818,37819],{},"API credentials",[478,37821,37822],{},"Install app",[17180,37824],{},[1603,37826],{"alt":107,"src":37827},"/images/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide_4.md.png",[46,37829,37830,37831],{},"In the modal that appears, click ",[478,37832,37833],{},"Install",[46,37835,37836,37837,37839],{},"The page will now display a form containing your access token.",[17180,37838],{},[1603,37840],{"alt":107,"src":37841},"/images/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide_5.md.png",[46,37843,17161,37844],{},[478,37845,37846],{},"Reveal token once",[46,37848,37849,37850],{},"Copy and paste the token to the ",[478,37851,37852],{},"Sign in and Authorize page",[35,37854,37856],{"id":37855},"step-6-retrieve-your-shopify-store-id","Step 6: Retrieve your Shopify store ID",[43,37858,37859,37865,37876],{},[46,37860,37861,37862],{},"While you are in the Shopify admin dashboard, observe the URL in your address bar - it should look something like this: ",[109,37863,37864],{},"https://admin.shopify.com/store/9564e1-49",[46,37866,37867,37868,37871,37872,37875],{},"Your unique Shopify store ID is the part that comes after ",[109,37869,37870],{},"/store"," e.g. ",[109,37873,37874],{},"9564e1-49"," in the above example",[46,37877,37878,37879,9903],{},"Copy and paste the ID to the ",[478,37880,37881],{},"Sign in and Authorize",[19,37883,37884],{},"You've now retrieved your Shopify Admin API access token and Store ID. That's one system covered—but scaling integrations one by one means repeating this process hundreds of times.",[19,37886,34052],{},[19,37888,37889,34058],{},[1614,37890,28800],{"href":33418,"rel":37891},[1618],{"title":107,"searchDepth":126,"depth":126,"links":37893},[37894],{"id":37627,"depth":126,"text":37628,"children":37895},[37896,37897,37898,37899,37900],{"id":37663,"depth":135,"text":37664},{"id":37696,"depth":135,"text":37697},{"id":37729,"depth":135,"text":37730},{"id":37811,"depth":135,"text":37812},{"id":37855,"depth":135,"text":37856},"If you're building an integration with Shopify, you'll need an Admin API access token and Store ID from your customer's Shopify account to authenticate...",{"img":37903,"date":37904,"tag":3},"/images/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide_icon.md.png","2023-11-14T19:41:00.000Z","/guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide",{"title":37606,"description":37901},"guides/how_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide","9GGofwnOgIkFIBT_I8qRV80FCmBV75kZPfsKxhld13A",{"id":37910,"title":37911,"body":37912,"description":38061,"extension":1576,"meta":38062,"navigation":271,"path":38065,"seo":38066,"stem":38067,"__hash__":38068},"guides/guides/how_to_get_your_wayfair_client_id_client_secret_and_vendor_encrypted_key_step_by_step_guide.md","How to get your Wayfair Client ID, Client Secret and Vendor Encrypted Key - Step-by-step guide",{"type":9,"value":37913,"toc":38058},[37914,37918,37920,37925,37928,37931,37937,37941,38048,38051,38053],[12,37915,37917],{"id":37916},"how-to-get-your-wayfair-client-id-client-secret-and-vendor-encrypted-key-step-by-step-guide","How to get your Wayfair Client ID, Client Secret and Vendor Encrypted Key: Step-by-step guide",[16,37919],{},[19,37921,37922],{},[22,37923,37924],{},"November 19, 2024",[19,37926,37927],{},"If you're building an integration with Wayfair, you'll need an Client ID, Client Secret and Vendor Encrypted Key from your customer's Wayfair account to authenticate requests.",[19,37929,37930],{},"This guide shows you (or your customers) how to generate one from Wayfair's account settings.",[19,37932,9817,37933,37936],{},[109,37934,37935],{},"Encrypted API Key"," can be found in the UI for Supplier management of Vendor apps.",[67,37938,37940],{"id":37939},"steps","Steps:",[43,37942,37943,37946,37949,37952,37955,37963,38040],{},[46,37944,37945],{},"Go to the Supplier Integration Status page",[46,37947,37948],{},"Select \"Vendor Applications\" tab",[46,37950,37951],{},"Hit \"Manage\" on the Catalog API row",[46,37953,37954],{},"Select your Vendor from the list",[46,37956,37957,37958],{},"Grant the needed permissions (see overview of permissions below)\n",[43,37959,37960],{},[46,37961,37962],{},"Note: Only the permissions that correspond to capabilities that a given Vendor\nhas adopted will be viewable + grantable.",[46,37964,37965,37966],{},"Overview of permissions:\n",[43,37967,37968,37974,37980,37986,37992,37998,38004,38010,38016,38022,38028,38034,38037],{},[46,37969,37970,37973],{},[478,37971,37972],{},"read-product-classes","; Gets the product classes that suppliers can list items for sale",[46,37975,37976,37979],{},[478,37977,37978],{},"read-product-catalog","; Export the supplier product catalog",[46,37981,37982,37985],{},[478,37983,37984],{},"write-product-generic-description","; Update the generic descriptions for products",[46,37987,37988,37991],{},[478,37989,37990],{},"read-product-generic-description-update-status","; Checks the status of generic description updates",[46,37993,37994,37997],{},[478,37995,37996],{},"read-product-generic-descriptions-by-part","; Get the existing generic descriptions given a supplier part number",[46,37999,38000,38003],{},[478,38001,38002],{},"read-media-metadata-tags","; Get the metadata tags associated with media;",[46,38005,38006,38009],{},[478,38007,38008],{},"read-media-uploaded","; Get the list of media that was uploaded for a product",[46,38011,38012,38015],{},[478,38013,38014],{},"read-media-uploaded-status","; Get the uploaded status for a given media request",[46,38017,38018,38021],{},[478,38019,38020],{},"write-media-upload-from-url;"," Uploads new media and associates it with a product",[46,38023,38024,38027],{},[478,38025,38026],{},"read-product-create-submit-status;"," Check the status of a new product request",[46,38029,38030,38033],{},[478,38031,38032],{},"read-product-create-questions","; Get the questions required by a product class for listing new items for\nsale",[46,38035,38036],{},"write-product-create-submit; Submit a new product to be listed on site",[46,38038,38039],{},"read-supplier-brand-associations; Get the supplier brands that are authorized for the supplier to sell",[46,38041,38042,38043],{},"On the Vendor application page, can copy their encrypted key by pressing the \"Copy Encrypted Key\" button.\n",[43,38044,38045],{},[46,38046,38047],{},"This encrypted key is just an encrypted supplier ID + name. This is more secure\nthan using inputing SuID into the Vendor's system.",[19,38049,38050],{},"Generating a Wayfair Client ID, Client Secret and Vendor Encrypted Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[19,38052,33413],{},[19,38054,38055,33420],{},[1614,38056,28800],{"href":33418,"rel":38057},[1618],{"title":107,"searchDepth":126,"depth":126,"links":38059},[38060],{"id":37939,"depth":126,"text":37940},"If you're building an integration with Wayfair, you'll need an Client ID, Client Secret and Vendor Encrypted Key from your customer's Wayfair account to...",{"img":38063,"date":38064,"tag":3},"/images/guides/how_to_get_your_wayfair_client_id_client_secret_and_vendor_encrypted_key_step_by_step_guide_icon.md.png","2024-11-19T21:11:00.000Z","/guides/how_to_get_your_wayfair_client_id_client_secret_and_vendor_encrypted_key_step_by_step_guide",{"title":37911,"description":38061},"guides/how_to_get_your_wayfair_client_id_client_secret_and_vendor_encrypted_key_step_by_step_guide","NFd8nAu277PIgO2r3qgRh7UJb9aXfA7KUbvqBTfaWx8",{"id":38070,"title":38071,"body":38072,"description":38086,"extension":1576,"meta":38174,"navigation":271,"path":38176,"seo":38177,"stem":38178,"__hash__":38179},"guides/guides/how_to_get_your_workable_api_token_and_subdomain_step_by_step_guide.md","How to get your Workable API Token and Subdomain - Step-by-step guide",{"type":9,"value":38073,"toc":38168},[38074,38078,38080,38084,38087,38090,38094,38097,38104,38109,38112,38117,38120,38125,38139,38143,38146,38151,38155,38158,38161,38163],[12,38075,38077],{"id":38076},"how-to-get-your-workable-api-token-and-subdomain-step-by-step-guide","How to get your Workable API Token and Subdomain: Step-by-step guide",[16,38079],{},[19,38081,38082],{},[22,38083,33294],{},[19,38085,38086],{},"Workable supports authentication with  API Token and Subdomain. To connect, you'll need to generate secure API Token and Subdomain from your account settings.",[19,38088,38089],{},"This short guide shows you how to generate one—whether you're testing in your sandbox or helping customers connect their Workable account.",[67,38091,38093],{"id":38092},"generate-an-api-access-token","Generate an API access token",[19,38095,38096],{},"This guide shows how to generate an API access token for your Workable account.",[19,38098,38099,38100,171],{},"To start, open the drop-down menu on the top right of your screen and select \"Integrations\" or press ",[1614,38101,17258],{"href":38102,"rel":38103},"https://www.workable.com/backend/account/integrations",[1618],[19,38105,38106],{},[1603,38107],{"alt":107,"src":38108},"/images/guides/how_to_get_your_workable_api_token_and_subdomain_step_by_step_guide_0.md.png",[19,38110,38111],{},"Now click on the \"Generate new token\" button:",[19,38113,38114],{},[1603,38115],{"alt":107,"src":38116},"/images/guides/how_to_get_your_workable_api_token_and_subdomain_step_by_step_guide_1.md.png",[19,38118,38119],{},"Once you click the generate button, you'll see the new access token being generated:",[19,38121,38122],{},[1603,38123],{"alt":107,"src":38124},"/images/guides/how_to_get_your_workable_api_token_and_subdomain_step_by_step_guide_2.md.png",[19,38126,38127,38128,38131,38132,33518,38135,38138],{},"This token type does not support ",[109,38129,38130],{},"r_employees"," scope. There are also new scopes like ",[109,38133,38134],{},"w_employees",[109,38136,38137],{},"r_account"," that are not currently supported by access tokens already used for ATS related endpoints. You need to contact support to enable them for your account tokens.",[35,38140,38142],{"id":38141},"subdomain","Subdomain",[19,38144,38145],{},"You will also need the account subdomain which you can find in the company profile settings page:",[19,38147,38148],{},[1603,38149],{"alt":107,"src":38150},"/images/guides/how_to_get_your_workable_api_token_and_subdomain_step_by_step_guide_3.md.png",[35,38152,38154],{"id":38153},"revoking-the-access-token","Revoking The Access Token",[19,38156,38157],{},"Be aware that you can revoke this access token anytime, but if you decide to proceed, every script or application that accesses the Workable API through this token will stop functioning. To keep things running smoothly after revoking your current token, you will have to generate a new access token and update every script or application bound to the previous one.",[19,38159,38160],{},"You've now retrieved your Workable API Token and Subdomain. That's one system covered—but scaling integrations one by one means repeating this process hundreds of times.",[19,38162,34052],{},[19,38164,38165,34058],{},[1614,38166,28800],{"href":33418,"rel":38167},[1618],{"title":107,"searchDepth":126,"depth":126,"links":38169},[38170],{"id":38092,"depth":126,"text":38093,"children":38171},[38172,38173],{"id":38141,"depth":135,"text":38142},{"id":38153,"depth":135,"text":38154},{"img":38175,"date":37599,"tag":3},"/images/guides/how_to_get_your_workable_api_token_and_subdomain_step_by_step_guide_icon.md.png","/guides/how_to_get_your_workable_api_token_and_subdomain_step_by_step_guide",{"title":38071,"description":38086},"guides/how_to_get_your_workable_api_token_and_subdomain_step_by_step_guide","wjYs0o6n_0UkAcp9FnhSwKlnt8qkU3s5qUloR3KWnXk",{"id":38181,"title":38182,"body":38183,"description":38198,"extension":1576,"meta":38297,"navigation":271,"path":38300,"seo":38301,"stem":38302,"__hash__":38303},"guides/guides/how_to_get_your_yotpo_app_key_store_id_and_secret_key_step_by_step_guide.md","How to get your yotpo APP Key / Store ID and Secret Key - Step-by-step guide",{"type":9,"value":38184,"toc":38295},[38185,38189,38191,38196,38199,38201,38207,38212,38217,38239,38244,38250,38255,38260,38280,38285,38288,38290],[12,38186,38188],{"id":38187},"how-to-get-your-yotpo-app-key-store-id-and-secret-key-step-by-step-guide","How to get your yotpo APP Key / Store ID and Secret Key: Step-by-step guide",[16,38190],{},[19,38192,38193],{},[22,38194,38195],{},"April 4, 2025",[19,38197,38198],{},"To access yotpo data or automate workflows through an integration, a APP Key / Store ID and Secret Key are required.",[19,38200,33877],{},[12,38202,38204],{"id":38203},"retrieving-your-app-key",[478,38205,38206],{},"Retrieving your app key",[19,38208,38209],{},[478,38210,38211],{},"Your app key is sometimes referred to as your Store ID.",[19,38213,38214],{},[478,38215,38216],{},"To retrieve your app key:",[43,38218,38219,38224],{},[46,38220,38221],{},[478,38222,38223],{},"In Yotpo Reviews, click the Profile icon at the top right corner of the screen.",[46,38225,38226,37401,38229,38236],{},[478,38227,38228],{},"Select Account Settings >",[1614,38230,38233],{"href":38231,"rel":38232},"https://settings.yotpo.com/#/general_settings",[1618],[478,38234,38235],{},"General Settings",[478,38237,38238],{},". You'll find your App Key at the bottom of the General Settings section.",[19,38240,38241],{},[478,38242,38243],{},"If you need a Secret Key, you'll need to generate it.",[12,38245,38247],{"id":38246},"generating-your-secret-key",[478,38248,38249],{},"Generating your secret key",[19,38251,38252],{},[478,38253,38254],{},"Your secret key is sometimes referred to as your API secret.",[19,38256,38257],{},[478,38258,38259],{},"To generate your secret key:",[43,38261,38262,38275],{},[46,38263,38264,37401,38267,38273],{},[478,38265,38266],{},"Follow the steps above to get to your",[1614,38268,38270],{"href":38231,"rel":38269},[1618],[478,38271,38272],{},"Account Settings",[478,38274,634],{},[46,38276,38277],{},[478,38278,38279],{},"From your General Settings, click Get secret key. We'll send an email with a verification code to the email address associated with your account.",[19,38281,38282],{},[478,38283,38284],{},"3. Paste the code from the email and click Submit. Your secret key will be revealed on the next screen. Remember, only share your secret key with parties that should have access to your data.",[19,38286,38287],{},"Generating a yotpo APP Key / Store ID and Secret Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[19,38289,33413],{},[19,38291,38292,33420],{},[1614,38293,28800],{"href":33418,"rel":38294},[1618],{"title":107,"searchDepth":126,"depth":126,"links":38296},[],{"img":38298,"date":38299,"tag":3},"/images/guides/how_to_get_your_yotpo_app_key_store_id_and_secret_key_step_by_step_guide_icon.md.png","2025-04-04T13:52:00.000Z","/guides/how_to_get_your_yotpo_app_key_store_id_and_secret_key_step_by_step_guide",{"title":38182,"description":38198},"guides/how_to_get_your_yotpo_app_key_store_id_and_secret_key_step_by_step_guide","nQBMFXtBjMigjpQlyds_Nh2KhpHFZiZGliHjaWOUiU4",{"id":38305,"title":38306,"body":38307,"description":38664,"extension":1576,"meta":38665,"navigation":271,"path":38668,"seo":38669,"stem":38670,"__hash__":38671},"guides/guides/how_to_handle_attachments_in_invoice_bill_and_credit_memo.md","How to Handle Attachments in Invoice, Bill and Credit Memo",{"type":9,"value":38308,"toc":38654},[38309,38312,38314,38319,38325,38327,38331,38334,38367,38377,38379,38383,38386,38394,38410,38412,38416,38419,38434,38436,38456,38458,38462,38465,38483,38485,38489,38496,38508,38510,38514,38517,38535,38538,38563,38566,38569,38625,38627,38631,38637,38639,38643,38651],[12,38310,38306],{"id":38311},"how-to-handle-attachments-in-invoice-bill-and-credit-memo",[16,38313],{},[19,38315,38316],{},[22,38317,38318],{},"August 5, 2025",[19,38320,38321,38322,27120],{},"Unified.to provides a standardized way to read, upload, and manage attachments (e.g., invoices, receipts, contracts) across various integrations like accounting, CRM, and etc platforms. Here's everything you need to know to get started with attachments via the ",[109,38323,38324],{},"Storage File",[16,38326],{},[35,38328,38330],{"id":38329},"how-to-check-if-an-integration-supports-attachments","🔍 How to Check If an Integration Supports Attachments",[19,38332,38333],{},"To check if a specific integration supports reading or writing attachments:",[43,38335,38336,38342,38346,38356],{},[46,38337,38338,38341],{},[478,38339,38340],{},"Go to the Integration Page"," in the Unified.to dashboard.",[46,38343,9735,38344,634],{},[478,38345,12328],{},[46,38347,38348,38349,38352,38353,772],{},"Select the relevant ",[478,38350,38351],{},"endpoint"," (e.g., ",[109,38354,38355],{},"Accounting → Invoice",[46,38357,38358,38359,38362,38363,38366],{},"Look under ",[478,38360,38361],{},"Readable Fields"," — if ",[109,38364,38365],{},"attachments"," is listed, the endpoint supports reading attachments.",[19,38368,38369,38370,38373,38374,27120],{},"🛠️ ",[478,38371,38372],{},"Tip:"," You can also check support programmatically using the ",[109,38375,38376],{},"/storage",[16,38378],{},[35,38380,38382],{"id":38381},"how-to-list-all-attachments","📂 How to List All Attachments",[19,38384,38385],{},"To fetch all available attachments across an integration:",[72,38387,38388],{},[46,38389,2604,38390,38393],{},[109,38391,38392],{},"GET /storage"," (Storage File List) endpoint.",[19,38395,9555,38396,38398,38399,38402,38403,2251,38406,38409],{},[478,38397,12467],{}," Most integrations ",[478,38400,38401],{},"do not support"," listing all attachments globally. Unified.to reflects this limitation. However, some integrations like ",[478,38404,38405],{},"Sage",[22,38407,38408],{},"do"," support it.",[16,38411],{},[35,38413,38415],{"id":38414},"how-to-fetch-attachments-for-a-specific-record-eg-invoice","📌 How to Fetch Attachments for a Specific Record (e.g., Invoice)",[19,38417,38418],{},"To get attachments for a specific entity like an invoice, bill, or candidate:",[72,38420,38421,38425],{},[46,38422,2604,38423,27120],{},[109,38424,38392],{},[46,38426,38427,38428,38352,38431,38433],{},"Pass the corresponding ",[109,38429,38430],{},"parent_id",[109,38432,23136],{},") in the query parameters.",[19,38435,10603],{},[102,38437,38439],{"className":174,"code":38438,"language":176,"meta":177,"style":107},"http\nCopyEdit\nGET /storage-file?parent_id=inv_1234\n",[109,38440,38441,38446,38451],{"__ignoreMap":107},[112,38442,38443],{"class":114,"line":115},[112,38444,38445],{},"http\n",[112,38447,38448],{"class":114,"line":126},[112,38449,38450],{},"CopyEdit\n",[112,38452,38453],{"class":114,"line":135},[112,38454,38455],{},"GET /storage-file?parent_id=inv_1234\n",[16,38457],{},[35,38459,38461],{"id":38460},"how-to-get-details-of-a-specific-attachment","🧾 How to Get Details of a Specific Attachment",[19,38463,38464],{},"To retrieve metadata (name, file type, size, etc.) of a particular attachment:",[72,38466,38467],{},[46,38468,38469,38470],{},"Use either:\n",[72,38471,38472,38478],{},[46,38473,38474,38477],{},[109,38475,38476],{},"GET /storage/:id"," — to get a single attachment",[46,38479,38480,38482],{},[109,38481,38392],{}," — to filter and retrieve multiple files with query params",[16,38484],{},[35,38486,38488],{"id":38487},"how-to-download-an-attachment","📥 How to Download an Attachment",[19,38490,38491,38492,38495],{},"We return a secure ",[109,38493,38494],{},"download_url"," in the response when you fetch an attachment. You can use this URL to download the file directly.",[19,38497,9555,38498,38500,38501,38503,38504,38507],{},[478,38499,12467],{}," The ",[109,38502,38494],{}," is ",[478,38505,38506],{},"time-limited"," and expires after a few minutes for security reasons. Always use the URL shortly after fetching.",[16,38509],{},[35,38511,38513],{"id":38512},"how-to-upload-or-create-an-attachment","📤 How to Upload or Create an Attachment",[19,38515,38516],{},"To upload a new attachment:",[43,38518,38519,38529],{},[46,38520,9900,38521,38524,38525,38528],{},[478,38522,38523],{},"Integration Page"," and confirm the ",[109,38526,38527],{},"storage-file"," endpoint is supported under Feature Support.",[46,38530,2604,38531,38534],{},[109,38532,38533],{},"POST /storage-file"," endpoint with required fields.",[19,38536,38537],{},"Key fields:",[72,38539,38540,38544,38551],{},[46,38541,38542],{},[109,38543,637],{},[46,38545,38546,38548,38549],{},[109,38547,18783],{}," (base64 encoded) | ",[109,38550,38494],{},[46,38552,38553,38352,38555,1046,38557,1046,38560,610],{},[109,38554,38430],{},[109,38556,23136],{},[109,38558,38559],{},"bill_id",[109,38561,38562],{},"employee_id",[19,38564,38565],{},"Unified.to will automatically associate the attachment with the parent entity.",[19,38567,38568],{},"Example payload:",[102,38570,38572],{"className":2318,"code":38571,"language":2320,"meta":107,"style":107},"json\nCopyEdit\n{\n  \"file_name\": \"invoice-august.pdf\",\n  \"file_data\": \"base64-encoded-data\",\n  \"parent_id\": \"inv_1234\"\n}\n",[109,38573,38574,38579,38583,38587,38599,38611,38621],{"__ignoreMap":107},[112,38575,38576],{"class":114,"line":115},[112,38577,38578],{"class":236},"json\n",[112,38580,38581],{"class":114,"line":126},[112,38582,38450],{"class":236},[112,38584,38585],{"class":114,"line":135},[112,38586,2327],{"class":236},[112,38588,38589,38592,38594,38597],{"class":114,"line":147},[112,38590,38591],{"class":129},"  \"file_name\"",[112,38593,2335],{"class":236},[112,38595,38596],{"class":122},"\"invoice-august.pdf\"",[112,38598,288],{"class":236},[112,38600,38601,38604,38606,38609],{"class":114,"line":202},[112,38602,38603],{"class":129},"  \"file_data\"",[112,38605,2335],{"class":236},[112,38607,38608],{"class":122},"\"base64-encoded-data\"",[112,38610,288],{"class":236},[112,38612,38613,38616,38618],{"class":114,"line":208},[112,38614,38615],{"class":129},"  \"parent_id\"",[112,38617,2335],{"class":236},[112,38619,38620],{"class":122},"\"inv_1234\"\n",[112,38622,38623],{"class":114,"line":291},[112,38624,584],{"class":236},[16,38626],{},[35,38628,38630],{"id":38629},"how-to-associate-an-attachment-with-an-entity","🧷 How to Associate an Attachment with an Entity",[19,38632,38633,38634,38636],{},"When uploading a file, simply set the ",[109,38635,38430],{}," to the ID of the resource (invoice, bill, employee, etc.). Unified.to handles the rest — no extra linking needed.",[16,38638],{},[35,38640,38642],{"id":38641},"questions-or-requests","💬 Questions or Requests?",[72,38644,38645,38648],{},[46,38646,38647],{},"If you're unsure whether an integration supports attachments for a specific resource type, reach out to our support team.",[46,38649,38650],{},"If a feature isn't currently supported, let us know! We're always looking to expand support where possible.",[1558,38652,38653],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":107,"searchDepth":126,"depth":126,"links":38655},[38656,38657,38658,38659,38660,38661,38662,38663],{"id":38329,"depth":135,"text":38330},{"id":38381,"depth":135,"text":38382},{"id":38414,"depth":135,"text":38415},{"id":38460,"depth":135,"text":38461},{"id":38487,"depth":135,"text":38488},{"id":38512,"depth":135,"text":38513},{"id":38629,"depth":135,"text":38630},{"id":38641,"depth":135,"text":38642},"Unified.to provides a standardized way to read, upload, and manage attachments (e.g., invoices, receipts, contracts) across various integrations like...",{"img":38666,"date":38667,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_handle_attachments_in_invoice_bill_and_credit_memo-icon.png","2025-08-05T00:00:00.000Z","/guides/how_to_handle_attachments_in_invoice_bill_and_credit_memo",{"title":38306,"description":38664},"guides/how_to_handle_attachments_in_invoice_bill_and_credit_memo","rjyzuK4RraTQpZdaqmd5xIA8AHFf2-JjRZUYJeMkkHQ",{"id":38673,"title":38674,"body":38675,"description":39858,"extension":1576,"meta":39859,"navigation":271,"path":39862,"seo":39863,"stem":39864,"__hash__":39865},"guides/guides/how_to_migrate_or_import_your_integrations_into_unified.md","How to migrate or import your integrations into Unified.to",{"type":9,"value":38676,"toc":39844},[38677,38680,38682,38687,38693,38696,38699,38701,38703,38719,38723,38726,38730,38738,38742,38753,38757,38760,38786,38789,39299,39308,39312,39315,39400,39407,39507,39518,39522,39527,39649,39656,39660,39672,39676,39682,39764,39773,39777,39780,39791,39795,39819,39821,39841],[12,38678,38674],{"id":38679},"how-to-migrate-or-import-your-integrations-into-unifiedto",[16,38681],{},[19,38683,38684],{},[22,38685,38686],{},"October 25, 2024",[19,38688,38689],{},[1603,38690],{"alt":38691,"src":38692},"app.unified.to_connections_import_typedropbox.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_migrate_or_import_your_integrations_into_unified-0.png",[19,38694,38695],{},"This guide explains how to import your existing integrations into Unified.to, effectively creating new connections using your existing customer credentials. A connection is a secure link between your application and your customer's third-party account.",[19,38697,38698],{},"While connections are typically created through an auth flow where users grant access through the provider's authorization page, you can also create connections by importing existing credentials that your customers have already provided to you.",[67,38700,13634],{"id":13633},[19,38702,13637],{},[72,38704,38705,38708,38711],{},[46,38706,38707],{},"A Unified.to account.",[46,38709,38710],{},"Existing customer credentials for the integrations you want to import.",[46,38712,38713,38714,634],{},"Basic understanding of REST APIs, authentication flows, and ",[1614,38715,38718],{"href":38716,"rel":38717},"https://docs.unified.to/guides/end_users_integrations_and_connections#end-users-integrations-and-connections",[1618],"connections",[67,38720,38722],{"id":38721},"understand-the-authentication-types","Understand the authentication types",[19,38724,38725],{},"Before importing your integrations, you need to determine which authentication type each integration uses. Unified.to supports two main authentication flows:",[35,38727,38729],{"id":38728},"api-token-authentication","API token authentication",[72,38731,38732,38735],{},[46,38733,38734],{},"Simple token: Requires a single token or key.",[46,38736,38737],{},"Multi-field token: Requires multiple credentials (e.g. API key + domain).",[35,38739,38741],{"id":38740},"oauth-2-authentication","OAuth 2 authentication",[72,38743,38744,38747,38750],{},[46,38745,38746],{},"Requires client credentials (client ID and secret).",[46,38748,38749],{},"Requires access tokens and optional refresh tokens.",[46,38751,38752],{},"May include additional user information e.g. emails, names.",[67,38754,38756],{"id":38755},"check-instructions-for-the-integration-you-want-to-import","Check instructions for the integration you want to import",[19,38758,38759],{},"The Unified.to Core API contains information that will help you determine what you need to successfully import your integrations.",[43,38761,38762,38769],{},[46,38763,38764,38765,38768],{},"Make a GET request to the ",[109,38766,38767],{},"/unified/integration"," endpoint to get information about the integration you want to import, passing in the categories and/or names of the integrations you are interested in.",[46,38770,38771,38772],{},"Check the following fields in the response:\n",[72,38773,38774,38780],{},[46,38775,38776,38779],{},[109,38777,38778],{},"token_names",": Lists required credential fields for API token authentication.",[46,38781,38782,38785],{},[109,38783,38784],{},"token_instructions",": Provides guidance on where to find these credentials.",[19,38787,38788],{},"For example:",[102,38790,38792],{"className":9951,"code":38791,"language":9953,"meta":107,"style":107},"const baseUrl = 'https://api.unified.to/unified/integration';\nconst params = new URLSearchParams({\n  categories: ['ats', 'crm'].join(',')\n});\nconst url = `${baseUrl}?${params}`;\n\n// Make the request\nfetch(url, {\n  method: 'GET',\n  headers: {\n    'Authorization': `Bearer ${YOUR_API_KEY}`,\n    'Accept': 'application/json'\n  }\n})\n.then(response => {\n  if (!response.ok) {\n    throw new Error(`HTTP error! status: ${response.status}`);\n  }\n  return response.json();\n})\n.then(integrations => {\n  // Loop through each integration and log its auth details\n  integrations.forEach(integration => {\n    console.log(`\\n=== ${integration.name} ===`);\n    \n    // Log token information if it exists\n    if (integration.token_names && integration.token_names.length > 0) {\n      console.log('Required credentials:', integration.token_names);\n      console.log('How to find credentials:');\n      integration.token_instructions?.forEach((instruction, index) => {\n        console.log(`${index + 1}. ${instruction}`);\n      });\n    } else {\n      console.log('No token credentials required (likely uses OAuth)');\n    }\n  });\n})\n.catch(error => {\n  console.error('Error fetching integrations:', error);\n});\n\n/* Example output:\n\n=== ActiveCampaign ===\nRequired credentials: [\"API Key\", \"Domain\"]\nHow to find credentials:\n1. Your API key can be found in your account on the Settings page under the \"Developer\" tab...\n2. Your API URL can be found in your account on the My Settings page under the \"Developer\" tab...\n\n=== HubSpot ===\nNo token credentials required (likely uses OAuth)\n\n*/\n",[109,38793,38794,38808,38822,38846,38850,38873,38877,38882,38890,38898,38902,38918,38927,38931,38936,38950,38960,38983,38987,38997,39001,39015,39020,39036,39063,39067,39072,39092,39106,39119,39142,39170,39174,39182,39195,39199,39203,39207,39221,39234,39238,39242,39247,39251,39256,39261,39266,39271,39276,39280,39285,39290,39294],{"__ignoreMap":107},[112,38795,38796,38798,38801,38803,38806],{"class":114,"line":115},[112,38797,277],{"class":229},[112,38799,38800],{"class":129}," baseUrl",[112,38802,354],{"class":229},[112,38804,38805],{"class":122}," 'https://api.unified.to/unified/integration'",[112,38807,237],{"class":236},[112,38809,38810,38812,38814,38816,38818,38820],{"class":114,"line":126},[112,38811,277],{"class":229},[112,38813,26443],{"class":129},[112,38815,354],{"class":229},[112,38817,357],{"class":229},[112,38819,17299],{"class":118},[112,38821,363],{"class":236},[112,38823,38824,38827,38830,38832,38835,38838,38840,38842,38844],{"class":114,"line":135},[112,38825,38826],{"class":236},"  categories: [",[112,38828,38829],{"class":122},"'ats'",[112,38831,1046],{"class":236},[112,38833,38834],{"class":122},"'crm'",[112,38836,38837],{"class":236},"].",[112,38839,775],{"class":118},[112,38841,456],{"class":236},[112,38843,26540],{"class":122},[112,38845,15267],{"class":236},[112,38847,38848],{"class":114,"line":147},[112,38849,384],{"class":236},[112,38851,38852,38854,38857,38859,38861,38864,38867,38869,38871],{"class":114,"line":202},[112,38853,277],{"class":229},[112,38855,38856],{"class":129}," url",[112,38858,354],{"class":229},[112,38860,751],{"class":122},[112,38862,38863],{"class":236},"baseUrl",[112,38865,38866],{"class":122},"}?${",[112,38868,26613],{"class":236},[112,38870,640],{"class":122},[112,38872,237],{"class":236},[112,38874,38875],{"class":114,"line":208},[112,38876,272],{"emptyLinePlaceholder":271},[112,38878,38879],{"class":114,"line":291},[112,38880,38881],{"class":578},"// Make the request\n",[112,38883,38884,38887],{"class":114,"line":299},[112,38885,38886],{"class":118},"fetch",[112,38888,38889],{"class":236},"(url, {\n",[112,38891,38892,38894,38896],{"class":114,"line":307},[112,38893,14039],{"class":236},[112,38895,14042],{"class":122},[112,38897,288],{"class":236},[112,38899,38900],{"class":114,"line":315},[112,38901,14059],{"class":236},[112,38903,38904,38907,38909,38911,38914,38916],{"class":114,"line":323},[112,38905,38906],{"class":122},"    'Authorization'",[112,38908,2335],{"class":236},[112,38910,14069],{"class":122},[112,38912,38913],{"class":129},"YOUR_API_KEY",[112,38915,640],{"class":122},[112,38917,288],{"class":236},[112,38919,38920,38923,38925],{"class":114,"line":329},[112,38921,38922],{"class":122},"    'Accept'",[112,38924,2335],{"class":236},[112,38926,18578],{"class":122},[112,38928,38929],{"class":114,"line":341},[112,38930,1476],{"class":236},[112,38932,38933],{"class":114,"line":346},[112,38934,38935],{"class":236},"})\n",[112,38937,38938,38940,38942,38944,38946,38948],{"class":114,"line":366},[112,38939,634],{"class":236},[112,38941,18193],{"class":118},[112,38943,456],{"class":236},[112,38945,17690],{"class":517},[112,38947,18200],{"class":229},[112,38949,280],{"class":236},[112,38951,38952,38954,38956,38958],{"class":114,"line":381},[112,38953,13931],{"class":229},[112,38955,1419],{"class":236},[112,38957,375],{"class":229},[112,38959,17672],{"class":236},[112,38961,38962,38964,38966,38968,38970,38973,38975,38977,38979,38981],{"class":114,"line":387},[112,38963,17677],{"class":229},[112,38965,357],{"class":229},[112,38967,17682],{"class":118},[112,38969,456],{"class":236},[112,38971,38972],{"class":122},"`HTTP error! status: ${",[112,38974,17690],{"class":236},[112,38976,634],{"class":122},[112,38978,11487],{"class":236},[112,38980,640],{"class":122},[112,38982,464],{"class":236},[112,38984,38985],{"class":114,"line":392},[112,38986,1476],{"class":236},[112,38988,38989,38991,38993,38995],{"class":114,"line":409},[112,38990,621],{"class":229},[112,38992,17714],{"class":236},[112,38994,2320],{"class":118},[112,38996,1536],{"class":236},[112,38998,38999],{"class":114,"line":422},[112,39000,38935],{"class":236},[112,39002,39003,39005,39007,39009,39011,39013],{"class":114,"line":435},[112,39004,634],{"class":236},[112,39006,18193],{"class":118},[112,39008,456],{"class":236},[112,39010,12920],{"class":517},[112,39012,18200],{"class":229},[112,39014,280],{"class":236},[112,39016,39017],{"class":114,"line":440},[112,39018,39019],{"class":578},"  // Loop through each integration and log its auth details\n",[112,39021,39022,39025,39028,39030,39032,39034],{"class":114,"line":4949},[112,39023,39024],{"class":236},"  integrations.",[112,39026,39027],{"class":118},"forEach",[112,39029,456],{"class":236},[112,39031,13812],{"class":517},[112,39033,18200],{"class":229},[112,39035,280],{"class":236},[112,39037,39038,39040,39042,39044,39047,39049,39052,39054,39056,39058,39061],{"class":114,"line":4960},[112,39039,17339],{"class":236},[112,39041,1512],{"class":118},[112,39043,456],{"class":236},[112,39045,39046],{"class":122},"`",[112,39048,19472],{"class":129},[112,39050,39051],{"class":122},"=== ${",[112,39053,13812],{"class":236},[112,39055,634],{"class":122},[112,39057,637],{"class":236},[112,39059,39060],{"class":122},"} ===`",[112,39062,464],{"class":236},[112,39064,39065],{"class":114,"line":4972},[112,39066,18212],{"class":236},[112,39068,39069],{"class":114,"line":4984},[112,39070,39071],{"class":578},"    // Log token information if it exists\n",[112,39073,39074,39076,39079,39081,39084,39086,39088,39090],{"class":114,"line":4992},[112,39075,15209],{"class":229},[112,39077,39078],{"class":236}," (integration.token_names ",[112,39080,28529],{"class":229},[112,39082,39083],{"class":236}," integration.token_names.",[112,39085,14591],{"class":129},[112,39087,26513],{"class":229},[112,39089,14450],{"class":129},[112,39091,526],{"class":236},[112,39093,39094,39096,39098,39100,39103],{"class":114,"line":5000},[112,39095,20131],{"class":236},[112,39097,1512],{"class":118},[112,39099,456],{"class":236},[112,39101,39102],{"class":122},"'Required credentials:'",[112,39104,39105],{"class":236},", integration.token_names);\n",[112,39107,39108,39110,39112,39114,39117],{"class":114,"line":5008},[112,39109,20131],{"class":236},[112,39111,1512],{"class":118},[112,39113,456],{"class":236},[112,39115,39116],{"class":122},"'How to find credentials:'",[112,39118,464],{"class":236},[112,39120,39121,39124,39126,39128,39131,39133,39136,39138,39140],{"class":114,"line":5016},[112,39122,39123],{"class":236},"      integration.token_instructions?.",[112,39125,39027],{"class":118},[112,39127,735],{"class":236},[112,39129,39130],{"class":517},"instruction",[112,39132,1046],{"class":236},[112,39134,39135],{"class":517},"index",[112,39137,745],{"class":236},[112,39139,748],{"class":229},[112,39141,280],{"class":236},[112,39143,39144,39147,39149,39151,39153,39155,39158,39161,39164,39166,39168],{"class":114,"line":5024},[112,39145,39146],{"class":236},"        console.",[112,39148,1512],{"class":118},[112,39150,456],{"class":236},[112,39152,26816],{"class":122},[112,39154,39135],{"class":236},[112,39156,39157],{"class":229}," +",[112,39159,39160],{"class":129}," 1",[112,39162,39163],{"class":122},"}. ${",[112,39165,39130],{"class":236},[112,39167,640],{"class":122},[112,39169,464],{"class":236},[112,39171,39172],{"class":114,"line":5032},[112,39173,20069],{"class":236},[112,39175,39176,39178,39180],{"class":114,"line":5040},[112,39177,19361],{"class":236},[112,39179,14616],{"class":229},[112,39181,280],{"class":236},[112,39183,39184,39186,39188,39190,39193],{"class":114,"line":5046},[112,39185,20131],{"class":236},[112,39187,1512],{"class":118},[112,39189,456],{"class":236},[112,39191,39192],{"class":122},"'No token credentials required (likely uses OAuth)'",[112,39194,464],{"class":236},[112,39196,39197],{"class":114,"line":5052},[112,39198,3946],{"class":236},[112,39200,39201],{"class":114,"line":5061},[112,39202,567],{"class":236},[112,39204,39205],{"class":114,"line":5066},[112,39206,38935],{"class":236},[112,39208,39209,39211,39213,39215,39217,39219],{"class":114,"line":9217},[112,39210,634],{"class":236},[112,39212,20123],{"class":118},[112,39214,456],{"class":236},[112,39216,20134],{"class":517},[112,39218,18200],{"class":229},[112,39220,280],{"class":236},[112,39222,39223,39225,39227,39229,39232],{"class":114,"line":9225},[112,39224,1509],{"class":236},[112,39226,20134],{"class":118},[112,39228,456],{"class":236},[112,39230,39231],{"class":122},"'Error fetching integrations:'",[112,39233,20142],{"class":236},[112,39235,39236],{"class":114,"line":9237},[112,39237,384],{"class":236},[112,39239,39240],{"class":114,"line":9248},[112,39241,272],{"emptyLinePlaceholder":271},[112,39243,39244],{"class":114,"line":9253},[112,39245,39246],{"class":578},"/* Example output:\n",[112,39248,39249],{"class":114,"line":9261},[112,39250,272],{"emptyLinePlaceholder":271},[112,39252,39253],{"class":114,"line":9267},[112,39254,39255],{"class":578},"=== ActiveCampaign ===\n",[112,39257,39258],{"class":114,"line":9272},[112,39259,39260],{"class":578},"Required credentials: [\"API Key\", \"Domain\"]\n",[112,39262,39263],{"class":114,"line":9280},[112,39264,39265],{"class":578},"How to find credentials:\n",[112,39267,39268],{"class":114,"line":9293},[112,39269,39270],{"class":578},"1. Your API key can be found in your account on the Settings page under the \"Developer\" tab...\n",[112,39272,39273],{"class":114,"line":9304},[112,39274,39275],{"class":578},"2. Your API URL can be found in your account on the My Settings page under the \"Developer\" tab...\n",[112,39277,39278],{"class":114,"line":9309},[112,39279,272],{"emptyLinePlaceholder":271},[112,39281,39282],{"class":114,"line":9317},[112,39283,39284],{"class":578},"=== HubSpot ===\n",[112,39286,39287],{"class":114,"line":9328},[112,39288,39289],{"class":578},"No token credentials required (likely uses OAuth)\n",[112,39291,39292],{"class":114,"line":9337},[112,39293,272],{"emptyLinePlaceholder":271},[112,39295,39296],{"class":114,"line":9342},[112,39297,39298],{"class":578},"*/\n",[19,39300,39301,2251,39303,634],{},[478,39302,18117],{},[1614,39304,39307],{"href":39305,"rel":39306},"https://docs.unified.to/unified/integration/Returns_all_integrations",[1618],"Get all integrations",[67,39309,39311],{"id":39310},"import-an-api-token-integration","Import an API token integration",[19,39313,39314],{},"For single-token integrations, construct your connection object:",[102,39316,39318],{"className":2318,"code":39317,"language":2320,"meta":107,"style":107},"{\n  \"integration_type\": NAME_OF_INTEGRATION,\n  \"permissions\": [PERMISSIONS],\n  \"categories\": [CATEGORIES],\n  \"environment\": \"Production\", // or any other non-sandbox environment\n  \"auth\": {\n    \"token\": \"your_customer_token\"\n  }\n}\n",[109,39319,39320,39324,39336,39348,39360,39375,39382,39392,39396],{"__ignoreMap":107},[112,39321,39322],{"class":114,"line":115},[112,39323,2327],{"class":236},[112,39325,39326,39329,39331,39334],{"class":114,"line":126},[112,39327,39328],{"class":129},"  \"integration_type\"",[112,39330,2335],{"class":236},[112,39332,39333],{"class":2885},"NAME_OF_INTEGRATION",[112,39335,288],{"class":236},[112,39337,39338,39341,39343,39346],{"class":114,"line":135},[112,39339,39340],{"class":129},"  \"permissions\"",[112,39342,3903],{"class":236},[112,39344,39345],{"class":2885},"PERMISSIONS",[112,39347,3908],{"class":236},[112,39349,39350,39353,39355,39358],{"class":114,"line":147},[112,39351,39352],{"class":129},"  \"categories\"",[112,39354,3903],{"class":236},[112,39356,39357],{"class":2885},"CATEGORIES",[112,39359,3908],{"class":236},[112,39361,39362,39365,39367,39370,39372],{"class":114,"line":202},[112,39363,39364],{"class":129},"  \"environment\"",[112,39366,2335],{"class":236},[112,39368,39369],{"class":122},"\"Production\"",[112,39371,1046],{"class":236},[112,39373,39374],{"class":578},"// or any other non-sandbox environment\n",[112,39376,39377,39380],{"class":114,"line":208},[112,39378,39379],{"class":129},"  \"auth\"",[112,39381,3888],{"class":236},[112,39383,39384,39387,39389],{"class":114,"line":291},[112,39385,39386],{"class":129},"    \"token\"",[112,39388,2335],{"class":236},[112,39390,39391],{"class":122},"\"your_customer_token\"\n",[112,39393,39394],{"class":114,"line":299},[112,39395,1476],{"class":236},[112,39397,39398],{"class":114,"line":307},[112,39399,584],{"class":236},[19,39401,39402,39403,39406],{},"For multi-field token integrations, use the ",[109,39404,39405],{},"other_auth_info"," array:",[102,39408,39410],{"className":2318,"code":39409,"language":2320,"meta":107,"style":107},"{\n  \"integration_type\": NAME_OF_INTEGRATION,\n  \"permissions\": [PERMISSIONS],\n  \"categories\": [CATEGORIES],\n  \"environment\": \"Production\", //  or any other non-sandbox environment\n  \"auth\": {\n    \"token\": \"your_customer_token\"\n    \"other_auth_info\": [\n      \"first_credential\",\n      \"second_credential\"\n    ]\n  }\n}\n",[109,39411,39412,39416,39426,39436,39446,39459,39465,39473,39482,39489,39494,39499,39503],{"__ignoreMap":107},[112,39413,39414],{"class":114,"line":115},[112,39415,2327],{"class":236},[112,39417,39418,39420,39422,39424],{"class":114,"line":126},[112,39419,39328],{"class":129},[112,39421,2335],{"class":236},[112,39423,39333],{"class":2885},[112,39425,288],{"class":236},[112,39427,39428,39430,39432,39434],{"class":114,"line":135},[112,39429,39340],{"class":129},[112,39431,3903],{"class":236},[112,39433,39345],{"class":2885},[112,39435,3908],{"class":236},[112,39437,39438,39440,39442,39444],{"class":114,"line":147},[112,39439,39352],{"class":129},[112,39441,3903],{"class":236},[112,39443,39357],{"class":2885},[112,39445,3908],{"class":236},[112,39447,39448,39450,39452,39454,39456],{"class":114,"line":202},[112,39449,39364],{"class":129},[112,39451,2335],{"class":236},[112,39453,39369],{"class":122},[112,39455,1046],{"class":236},[112,39457,39458],{"class":578},"//  or any other non-sandbox environment\n",[112,39460,39461,39463],{"class":114,"line":208},[112,39462,39379],{"class":129},[112,39464,3888],{"class":236},[112,39466,39467,39469,39471],{"class":114,"line":291},[112,39468,39386],{"class":129},[112,39470,2335],{"class":236},[112,39472,39391],{"class":122},[112,39474,39475,39478,39480],{"class":114,"line":299},[112,39476,39477],{"class":122},"    \"other_auth_info\"",[112,39479,171],{"class":2885},[112,39481,624],{"class":236},[112,39483,39484,39487],{"class":114,"line":307},[112,39485,39486],{"class":122},"      \"first_credential\"",[112,39488,288],{"class":236},[112,39490,39491],{"class":114,"line":315},[112,39492,39493],{"class":122},"      \"second_credential\"\n",[112,39495,39496],{"class":114,"line":323},[112,39497,39498],{"class":236},"    ]\n",[112,39500,39501],{"class":114,"line":329},[112,39502,1476],{"class":236},[112,39504,39505],{"class":114,"line":341},[112,39506,584],{"class":236},[19,39508,39509,39511,39512,39514,39515,39517],{},[478,39510,34028],{},": The order of credentials in ",[109,39513,39405],{}," must match the order of the ",[109,39516,38778],{}," from the integration instructions (see above).",[67,39519,39521],{"id":39520},"import-an-oauth-20-integration","Import an OAuth 2.0 integration",[43,39523,39524],{},[46,39525,39526],{},"Construct your connection object with the OAuth credentials:",[102,39528,39530],{"className":2318,"code":39529,"language":2320,"meta":107,"style":107},"{\n  \"integration_type\": NAME_OF_INTEGRATION,\n  \"permissions\": [PERMISSIONS],\n  \"categories\": [CATEGORIES],\n  \"environment\": \"Production\", //  or any other non-sandbox environment\n  \"auth\": {\n    \"access_token\": \"customer_access_token\",\n    \"refresh_token\": \"customer_refresh_token\",\n    \"expiry_date\": \"2024-12-31T23:59:59Z\",\n    \"emails\": [\"user@example.com\"],\n    \"name\": \"User Name\"\n  }\n}\n",[109,39531,39532,39536,39546,39556,39566,39578,39584,39596,39608,39620,39632,39641,39645],{"__ignoreMap":107},[112,39533,39534],{"class":114,"line":115},[112,39535,2327],{"class":236},[112,39537,39538,39540,39542,39544],{"class":114,"line":126},[112,39539,39328],{"class":129},[112,39541,2335],{"class":236},[112,39543,39333],{"class":2885},[112,39545,288],{"class":236},[112,39547,39548,39550,39552,39554],{"class":114,"line":135},[112,39549,39340],{"class":129},[112,39551,3903],{"class":236},[112,39553,39345],{"class":2885},[112,39555,3908],{"class":236},[112,39557,39558,39560,39562,39564],{"class":114,"line":147},[112,39559,39352],{"class":129},[112,39561,3903],{"class":236},[112,39563,39357],{"class":2885},[112,39565,3908],{"class":236},[112,39567,39568,39570,39572,39574,39576],{"class":114,"line":202},[112,39569,39364],{"class":129},[112,39571,2335],{"class":236},[112,39573,39369],{"class":122},[112,39575,1046],{"class":236},[112,39577,39458],{"class":578},[112,39579,39580,39582],{"class":114,"line":208},[112,39581,39379],{"class":129},[112,39583,3888],{"class":236},[112,39585,39586,39589,39591,39594],{"class":114,"line":291},[112,39587,39588],{"class":129},"    \"access_token\"",[112,39590,2335],{"class":236},[112,39592,39593],{"class":122},"\"customer_access_token\"",[112,39595,288],{"class":236},[112,39597,39598,39601,39603,39606],{"class":114,"line":299},[112,39599,39600],{"class":129},"    \"refresh_token\"",[112,39602,2335],{"class":236},[112,39604,39605],{"class":122},"\"customer_refresh_token\"",[112,39607,288],{"class":236},[112,39609,39610,39613,39615,39618],{"class":114,"line":307},[112,39611,39612],{"class":129},"    \"expiry_date\"",[112,39614,2335],{"class":236},[112,39616,39617],{"class":122},"\"2024-12-31T23:59:59Z\"",[112,39619,288],{"class":236},[112,39621,39622,39625,39627,39630],{"class":114,"line":315},[112,39623,39624],{"class":129},"    \"emails\"",[112,39626,3903],{"class":236},[112,39628,39629],{"class":122},"\"user@example.com\"",[112,39631,3908],{"class":236},[112,39633,39634,39636,39638],{"class":114,"line":323},[112,39635,26184],{"class":129},[112,39637,2335],{"class":236},[112,39639,39640],{"class":122},"\"User Name\"\n",[112,39642,39643],{"class":114,"line":329},[112,39644,1476],{"class":236},[112,39646,39647],{"class":114,"line":341},[112,39648,584],{"class":236},[43,39650,39651],{},[46,39652,39653,39654],{},"Log into the developer account for the provider whose integrations you are importing. Update your redirect URIs to point to Unified.to: ",[109,39655,34368],{},[19,39657,39658,171],{},[478,39659,1987],{},[72,39661,39662,39669],{},[46,39663,39664,39665,39668],{},"Set ",[109,39666,39667],{},"expiry_date"," to the token's expiration date (if known) or today's date.",[46,39670,39671],{},"Include the authenticating user's email and name if available.",[67,39673,39675],{"id":39674},"create-the-connection","Create the connection",[19,39677,39678,39679,171],{},"Make a POST request to create the connection. Example using ",[109,39680,39681],{},"curl",[102,39683,39685],{"className":17953,"code":39684,"language":17955,"meta":107,"style":107},"curl -X POST \"\u003Chttps://api.unified.to/unified/connection>\" \\\\\n  -H \"Authorization: Bearer YOUR_API_KEY\" \\\\\n  -H \"Content-Type: application/json\" \\\\\n  -d '{\n    \"integration_type\": \"your_integration_type\",\n    \"permissions\": [\"required_permissions\"],\n    \"categories\": [\"integration_category\"],\n    \"auth\": {\n      // Your auth object here\n    }\n  }'\n",[109,39686,39687,39703,39713,39722,39730,39735,39740,39745,39750,39755,39759],{"__ignoreMap":107},[112,39688,39689,39691,39694,39697,39700],{"class":114,"line":115},[112,39690,39681],{"class":118},[112,39692,39693],{"class":129}," -X",[112,39695,39696],{"class":122}," POST",[112,39698,39699],{"class":122}," \"\u003Chttps://api.unified.to/unified/connection>\"",[112,39701,39702],{"class":129}," \\\\\n",[112,39704,39705,39708,39711],{"class":114,"line":126},[112,39706,39707],{"class":129},"  -H",[112,39709,39710],{"class":122}," \"Authorization: Bearer YOUR_API_KEY\"",[112,39712,39702],{"class":129},[112,39714,39715,39717,39720],{"class":114,"line":135},[112,39716,39707],{"class":129},[112,39718,39719],{"class":122}," \"Content-Type: application/json\"",[112,39721,39702],{"class":129},[112,39723,39724,39727],{"class":114,"line":147},[112,39725,39726],{"class":129},"  -d",[112,39728,39729],{"class":122}," '{\n",[112,39731,39732],{"class":114,"line":202},[112,39733,39734],{"class":122},"    \"integration_type\": \"your_integration_type\",\n",[112,39736,39737],{"class":114,"line":208},[112,39738,39739],{"class":122},"    \"permissions\": [\"required_permissions\"],\n",[112,39741,39742],{"class":114,"line":291},[112,39743,39744],{"class":122},"    \"categories\": [\"integration_category\"],\n",[112,39746,39747],{"class":114,"line":299},[112,39748,39749],{"class":122},"    \"auth\": {\n",[112,39751,39752],{"class":114,"line":307},[112,39753,39754],{"class":122},"      // Your auth object here\n",[112,39756,39757],{"class":114,"line":315},[112,39758,3946],{"class":122},[112,39760,39761],{"class":114,"line":323},[112,39762,39763],{"class":122},"  }'\n",[19,39765,39766,2335,39768],{},[478,39767,17920],{},[1614,39769,39772],{"href":39770,"rel":39771},"https://docs.unified.to/unified/connection/Create_connection",[1618],"Create a connection",[67,39774,39776],{"id":39775},"test-the-imported-connection","Test the imported connection",[19,39778,39779],{},"After creating the connection:",[43,39781,39782,39785,39788],{},[46,39783,39784],{},"Note the connection ID from the response.",[46,39786,39787],{},"Make a test API call using the new connection ID to verify it works.",[46,39789,39790],{},"If the call fails, check the error message and verify your auth credentials.",[67,39792,39794],{"id":39793},"best-practices-when-importing-a-connection","Best practices when importing a connection",[72,39796,39797,39803,39809,39812],{},[46,39798,39799,39800,39802],{},"Always include relevant ",[109,39801,26297],{}," for the minimum set of data access you require.",[46,39804,39805,39806,634],{},"Use a non-sandbox ",[109,39807,39808],{},"environment",[46,39810,39811],{},"Store the connection ID securely for future API calls.",[46,39813,39814,39815,39818],{},"Consider adding ",[109,39816,39817],{},"external_xref"," to link the connection to your customer's ID.",[67,39820,25945],{"id":25944},[72,39822,39823,39830,39835],{},[46,39824,39825],{},[1614,39826,39829],{"href":39827,"rel":39828},"https://docs.unified.to/guides/how_to_associate_a_connection_id_with_your_end_user#how-to-associate-a-connection-id-with-your-end-user",[1618],"How to associate a connection ID with your end-user",[46,39831,39832],{},[1614,39833,10169],{"href":37010,"rel":39834},[1618],[46,39836,39837],{},[1614,39838,31448],{"href":39839,"rel":39840},"https://docs.unified.to/guides/how_to_create_and_configure_webhooks",[1618],[1558,39842,39843],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}",{"title":107,"searchDepth":126,"depth":126,"links":39845},[39846,39847,39851,39852,39853,39854,39855,39856,39857],{"id":13633,"depth":126,"text":13634},{"id":38721,"depth":126,"text":38722,"children":39848},[39849,39850],{"id":38728,"depth":135,"text":38729},{"id":38740,"depth":135,"text":38741},{"id":38755,"depth":126,"text":38756},{"id":39310,"depth":126,"text":39311},{"id":39520,"depth":126,"text":39521},{"id":39674,"depth":126,"text":39675},{"id":39775,"depth":126,"text":39776},{"id":39793,"depth":126,"text":39794},{"id":25944,"depth":126,"text":25945},"This guide explains how to import your existing integrations into Unified.to, effectively creating new connections using your existing customer credentials. A...",{"img":39860,"date":39861,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_migrate_or_import_your_integrations_into_unified-icon.webp","2024-10-25T00:00:00.000Z","/guides/how_to_migrate_or_import_your_integrations_into_unified",{"title":38674,"description":39858},"guides/how_to_migrate_or_import_your_integrations_into_unified","G_6JLOOT2ZDe9x0puqiSQt5LU-0nMSR2_x8cWxWAvCI",{"id":39867,"title":39868,"body":39869,"description":39951,"extension":1576,"meta":39952,"navigation":271,"path":39954,"seo":39955,"stem":39956,"__hash__":39957},"guides/guides/how_to_obtain_your_github_oauth2_credentials.md","How to obtain your GitHub OAuth2 credentials",{"type":9,"value":39870,"toc":39949},[39871,39874,39876,39880,39888,39893,39902,39909,39914,39921,39926,39937,39942],[12,39872,39868],{"id":39873},"how-to-obtain-your-github-oauth2-credentials",[16,39875],{},[19,39877,39878],{},[22,39879,36203],{},[19,39881,39882,39883,171],{},"In order to set up OAuth2 for Github, you need to create a new OAuth application in your ",[1614,39884,39887],{"href":39885,"rel":39886},"https://github.com/settings/applications/new",[1618],"GitHub developer settings",[19,39889,39890],{},[1603,39891],{"alt":11593,"src":39892},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-0.png",[19,39894,39895,39896,634],{},"Make sure to fill in the appropriate details, but more importantly the Authorization Callback URL, set to ",[1614,39897,39900],{"href":39898,"rel":39899},"https://localhost:8080/_renarde/security/github-success",[1618],[109,39901,34368],{},[19,39903,39904,39905,39908],{},"Now click on ",[109,39906,39907],{},"Register application"," and you'll be shown your application page:",[19,39910,39911],{},[1603,39912],{"alt":11593,"src":39913},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-1.png",[19,39915,39916,39917,39920],{},"You need to click on ",[109,39918,39919],{},"Generate a new client secret",", confirm your credentials, and write down your Client ID and Client secret (especially that one, because you will not be able to see it again later from that page, but you can always recreate one, do don't worry too much):",[19,39922,39923],{},[1603,39924],{"alt":11593,"src":39925},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-2.png",[19,39927,39928,39929,39932,39933],{},"Take your GitHub clientID and clientSecret and add them to the ",[1614,39930,1640],{"href":1638,"rel":39931},[1618]," integration settings for Github at ",[1614,39934,39935],{"href":39935,"rel":39936},"https://app.unified.to/integrations/github",[1618],[19,39938,39939],{},[1603,39940],{"alt":11593,"src":39941},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-3.png",[19,39943,39944,39945,39948],{},"You will now be ready to use GitHub on ",[1614,39946,1640],{"href":1638,"rel":39947},[1618]," realtime unified API.",{"title":107,"searchDepth":126,"depth":126,"links":39950},[],"In order to set up OAuth2 for Github, you need to create a new OAuth application in your GitHub developer settings,",{"img":39953,"date":36406,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-icon.png","/guides/how_to_obtain_your_github_oauth2_credentials",{"title":39868,"description":39951},"guides/how_to_obtain_your_github_oauth2_credentials","Sx0y3L9SzXu1Tg4cTFDLg-ZLwbnHEPXHGaaBvZn1tHA",{"id":39959,"title":39960,"body":39961,"description":40145,"extension":1576,"meta":40146,"navigation":271,"path":40149,"seo":40150,"stem":40151,"__hash__":40152},"guides/guides/how_to_power_claude_with_live_customer_data_using_unified_mcp.md","How to Power Claude with Live Customer Data Using Unified MCP",{"type":9,"value":39962,"toc":40138},[39963,39966,39968,39973,39979,39987,39990,39993,39997,40000,40003,40014,40018,40021,40026,40029,40034,40037,40041,40044,40047,40060,40063,40066,40070,40073,40087,40090,40094,40097,40102,40105,40122,40125,40128],[12,39964,39960],{"id":39965},"how-to-power-claude-with-live-customer-data-using-unified-mcp",[16,39967],{},[19,39969,39970],{},[22,39971,39972],{},"May 28, 2025",[19,39974,39975],{},[1603,39976],{"alt":39977,"src":39978},"MCPSERVER.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_power_claude_with_live_customer_data_using_unified_mcp-0.png",[19,39980,39981,39982,39986],{},"If you're building your software application with Anthropic's LLM API ",[1614,39983,1614],{"href":39984,"rel":39985},"https://claude.ai/",[1618],"nd want more than a thin agent, your application needs access to real end-customer data — like pulling HubSpot deals, sending a Slack message, or updating a candidate in Greenhouse.",[19,39988,39989],{},"You can wire this up yourself using Unified's API, which will save you a ton of time as it is a single API for multiple SaaS APIs. Or you can point your LLM API at Unified's MCP server and launch even faster.",[19,39991,39992],{},"We'll break down when to use Unified's MCP server, and when to reach for the API instead.",[67,39994,39996],{"id":39995},"how-unifieds-mcp-server-works","How Unified's MCP Server Works",[19,39998,39999],{},"Unified's MCP Server exposes real, user-authorized SaaS integrations to any LLM that supports Model Context Protocol.",[19,40001,40002],{},"Anthropic's API, Claude or Cursor can:",[72,40004,40005,40008,40011],{},[46,40006,40007],{},"Discover tools based on a given Unified connection",[46,40009,40010],{},"Call those tools directly through our MCP endpoint",[46,40012,40013],{},"Use the result in its next generation step",[67,40015,40017],{"id":40016},"two-paths-api-vs-mcp","Two Paths: API vs MCP",[19,40019,40020],{},"Unified supports two integration interfaces:",[19,40022,40023],{},[478,40024,40025],{},"1. Unified API (Backend Integration)",[19,40027,40028],{},"Best for production-grade apps. You fetch and transform data yourself, persist what matters, and optionally embed it in a vector database. Full control, real scalability.",[19,40030,40031],{},[478,40032,40033],{},"2. Unified MCP Server (Direct-to-LLM)",[19,40035,40036],{},"Best for prototyping or agent UXs. You point Anthropic's API, Claude or Cursor at a live MCP endpoint, and it auto-discovers available tools — all backed by your end-user's authorized connections.",[67,40038,40040],{"id":40039},"why-claude-mcp-is-the-best-fit","Why Claude + MCP Is the Best Fit",[19,40042,40043],{},"The strongest use case for Unified's MCP Server is direct integration with the Anthropic API. It's already a common pattern among Unified users: AI-native SaaS teams wiring real-time tools into their product experience.",[19,40045,40046],{},"With MCP, you now have two ways to access your customer's data:",[43,40048,40049,40054],{},[46,40050,2604,40051,40053],{},[478,40052,2129],{}," and call it from your backend",[46,40055,25346,40056,40059],{},[478,40057,40058],{},"Anthropic API"," at Unified's MCP Server and let it fetch tools on its own",[19,40061,40062],{},"This lets your team skip everything between OAuth and LLM — no middleware, no polling, no schema juggling. You stay focused on your product's core logic while Claude handles tool orchestration via Unified.",[19,40064,40065],{},"That's always been the promise of a Unified API: do less glue work and ship faster. MCP just makes that even more direct.",[67,40067,40069],{"id":40068},"what-to-do-if-youre-building-for-scale","What to Do if You're Building for Scale",[19,40071,40072],{},"If your product is heading toward scale, especially if it requires logging, observability, or context-aware data access, the better path is:",[43,40074,40075,40078,40081,40084],{},[46,40076,40077],{},"Use the Unified API to fetch and normalize data",[46,40079,40080],{},"Store and filter what matters",[46,40082,40083],{},"Embed it into a vector database",[46,40085,40086],{},"Let your LLM consume it through whatever interface makes sense",[19,40088,40089],{},"MCP is a fast path to working demos. The API is your infrastructure.",[67,40091,40093],{"id":40092},"example-flow","Example Flow",[19,40095,40096],{},"Claude gets this prompt:",[10506,40098,40099],{},[19,40100,40101],{},"'Post a message to #sales about the new signed deal.'",[19,40103,40104],{},"It:",[43,40106,40107,40113,40116,40119],{},[46,40108,40109,40110,610],{},"Identifies a tool call (e.g. ",[109,40111,40112],{},"send-slack-message",[46,40114,40115],{},"Sends the tool and parameters to Unified's MCP Server",[46,40117,40118],{},"Unified makes the call to Slack using the user's connection",[46,40120,40121],{},"Claude receives the result and continues the conversation",[19,40123,40124],{},"No servers, no APIs, no code in between.",[19,40126,40127],{},"Unified's MCP Server is in beta. It supports any authenticated connection, works with Claude or Cursor, and helps you wire up AI features fast without touching infrastructure.",[19,40129,40130,9571,40134,634],{},[1614,40131,40133],{"href":40132},"mailto:support@unified.to","Request early access",[1614,40135,40137],{"href":28844,"rel":40136},[1618],"read the MCP docs",{"title":107,"searchDepth":126,"depth":126,"links":40139},[40140,40141,40142,40143,40144],{"id":39995,"depth":126,"text":39996},{"id":40016,"depth":126,"text":40017},{"id":40039,"depth":126,"text":40040},{"id":40068,"depth":126,"text":40069},{"id":40092,"depth":126,"text":40093},"If you're building your software application with Anthropic's LLM API and want more than a thin agent, your application needs access to real end-customer data...",{"img":40147,"date":40148,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_power_claude_with_live_customer_data_using_unified_mcp-icon.webp","2025-05-28T00:00:00.000Z","/guides/how_to_power_claude_with_live_customer_data_using_unified_mcp",{"title":39960,"description":40145},"guides/how_to_power_claude_with_live_customer_data_using_unified_mcp","UvbO8kWyfe-5VjfooEEIsjlMTfRIiUcTBZSrHjZK6hY",{"id":40154,"title":40155,"body":40156,"description":40456,"extension":1576,"meta":40457,"navigation":271,"path":40460,"seo":40461,"stem":40462,"__hash__":40463},"guides/guides/how_to_register_a_google_developer_app_and_get_oauth_2_credentials.md","How to register a Google developer app and get OAuth 2 credentials",{"type":9,"value":40157,"toc":40454},[40158,40161,40163,40168,40190,40417,40422,40439,40444,40449],[12,40159,40155],{"id":40160},"how-to-register-a-google-developer-app-and-get-oauth-2-credentials",[16,40162],{},[19,40164,40165],{},[22,40166,40167],{},"May 29, 2025",[10506,40169,40170],{},[19,40171,40172,40173,40175,40176,9571,40179,40182,40183,40185,40186,634],{},"💡 ",[478,40174,13464],{}," that if you use ",[109,40177,40178],{},"Restricted",[109,40180,40181],{},"Sensitive"," Scopes you need to contact Unified's Support to setup a CNAME for the API URL in order to get your App approved by Google",[17180,40184],{},"\nCheck ",[1614,40187,40188],{"href":40188,"rel":40189},"https://docs.unified.to/guides/how_to_set_up_a_custom_api_url",[1618],[43,40191,40192,40212,40262,40293,40369],{},[46,40193,40194,40197],{},[478,40195,40196],{},"Create a Google Cloud Platform project:",[72,40198,40199,40206,40209],{},[46,40200,40201,40202,40205],{},"Go to the Google Cloud Console (",[1614,40203,36441],{"href":36441,"rel":40204},[1618],") and sign in.",[46,40207,40208],{},"If you don't have a project, click the \"Select a project\" dropdown and choose \"New Project\".",[46,40210,40211],{},"Give your project a name and click \"Create\".",[46,40213,40214,40217],{},[478,40215,40216],{},"Enable the Necessary APIs",[72,40218,40219,40222,40239,40253,40256],{},[46,40220,40221],{},"In the Google Cloud Console, make sure your newly created or existing project is selected.",[46,40223,9735,40224,40231,40234],{},[1614,40225,40228],{"href":40226,"rel":40227},"https://console.cloud.google.com/apis/library",[1618],[478,40229,40230],{},"APIs & Services",[1614,40232,31757],{"href":40226,"rel":40233},[1618],[1614,40235,40237],{"href":40226,"rel":40236},[1618],[478,40238,36468],{},[46,40240,40241,40242],{},"Search for the specific API you want to use (e.g., \"Gmail API\", \"Google Drive API\", 'Google Calendar API').\n",[72,40243,40244],{},[46,40245,40246,40247,40252],{},"For Google Directory, make sure that you have the",[1614,40248,40251],{"href":40249,"rel":40250},"https://console.cloud.google.com/apis/library/admin.googleapis.com",[1618]," Admin SDK API ","enabled.",[46,40254,40255],{},"Click on the API from the search results.",[46,40257,40258,40259,40261],{},"Click the \"",[478,40260,36493],{},"\" button. Repeat this for all Google APIs your application will need to access",[46,40263,40264,40267],{},[478,40265,40266],{},"Configure the OAuth Consent Screen",[72,40268,40269,40277,40282,40285],{},[46,40270,40271,40272],{},"In the Google Cloud Console, go to ",[1614,40273,40276],{"href":40274,"rel":40275},"https://console.cloud.google.com/auth/overview",[1618],"Google Auth Platform",[46,40278,40279,40280],{},"Fill in what is asked and click ",[478,40281,34308],{},[46,40283,40284],{},"Click 'Create'",[46,40286,11822,40287,40292],{},[1614,40288,40291],{"href":40289,"rel":40290},"https://console.cloud.google.com/auth/branding",[1618],"Auth Branding"," and fill in the required Information",[46,40294,40295,40297,40298],{},[478,40296,25481],{},": Select the scopes your application needs. Scopes define the permissions your app is requesting (e.g., read emails, access calendar). Be specific and only request the scopes you absolutely need.\n",[72,40299,40300,40307,40327,40353,40362],{},[46,40301,11822,40302],{},[1614,40303,40306],{"href":40304,"rel":40305},"https://console.cloud.google.com/auth/scopes",[1618],"Auth Data Access",[46,40308,40309,40310,1046,40312,1046,40315,1046,40318,11338,40321,9571,40324,634],{},"You will at least need ",[109,40311,36897],{},[109,40313,40314],{},"userinfo.email",[109,40316,40317],{},"userinfo.profile",[109,40319,40320],{},"admin.directory.group.readonly",[109,40322,40323],{},"admin.directory.user",[109,40325,40326],{},"admin.directory.user.readonly",[46,40328,40329,40330],{},"The scopes needed by other Google integrations can be found in the Unified App, for example:\n",[72,40331,40332,40339,40346],{},[46,40333,40334],{},[1614,40335,40338],{"href":40336,"rel":40337},"https://app.unified.to/integrations/googlecontacts?tab=oauth2",[1618],"Google Contacts",[46,40340,40341],{},[1614,40342,40345],{"href":40343,"rel":40344},"https://app.unified.to/integrations/googledirectory?tab=oauth2",[1618],"Google Directory",[46,40347,40348],{},[1614,40349,40352],{"href":40350,"rel":40351},"https://app.unified.to/integrations/googlemail?tab=oauth2",[1618],"Gmail",[46,40354,40355,40175,40357,9571,40359,40361],{},[478,40356,13464],{},[109,40358,40178],{},[109,40360,40181],{}," Scopes you need to contact Unified's Support to setup a CNAME for the redirect URL in order to get your App approved by Google",[46,40363,40364,40365,40368],{},"Review the information and click \"",[478,40366,40367],{},"Save and Continue","\" through the steps. If you selected \"External\" and are just testing, you can often leave your app in \"Testing\" publishing status. If you intend for it to be publicly available, you'll eventually need to \"Publish\" it and potentially go through verification.",[46,40370,40371,40372],{},"Create OAuth 2.0 Credentials\n",[72,40373,40374,40382,40389,40397,40400],{},[46,40375,11822,40376,40381],{},[1614,40377,40380],{"href":40378,"rel":40379},"https://console.cloud.google.com/auth/clients",[1618],"Auth Clients"," in the Google Cloud Console.",[46,40383,40384,40385,40388],{},"Click on \"",[478,40386,40387],{},"+ Create Client","\" at the top of the page, Follow the steps",[46,40390,40391,40392],{},"Configure the authorized redirect URIs.  Get the correct value from the Integration, for example ",[1614,40393,40396],{"href":40394,"rel":40395},"https://app.unified.to/integrations/googledrive?tab=oauth2",[1618],"Google Drive",[46,40398,40399],{},"Copy your Client ID and Secret",[46,40401,40402,40403],{},"Enter these values in your Integrations, for example:\n",[72,40404,40405,40412],{},[46,40406,40407],{},[1614,40408,40411],{"href":40409,"rel":40410},"https://app.unified.to/integrations/google",[1618],"Google",[46,40413,40414],{},[1614,40415,40352],{"href":36583,"rel":40416},[1618],[19,40418,40419],{},[1603,40420],{"alt":13589,"src":40421},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_google_developer_app_and_get_oauth_2_credentials-0.png",[43,40423,40424],{},[46,40425,40426,40427],{},"Publish your Application\n",[72,40428,40429,40436],{},[46,40430,11822,40431],{},[1614,40432,40435],{"href":40433,"rel":40434},"https://console.cloud.google.com/auth/audience",[1618],"Auth Audience",[46,40437,40438],{},"Click on Publish app",[19,40440,40441],{},[1603,40442],{"alt":13589,"src":40443},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_google_developer_app_and_get_oauth_2_credentials-1.png",[43,40445,40446],{},[46,40447,40448],{},"Once your application is approved and verified it will start showing your application name on the authorization consent screen. Until then it will be showing the 'unified.to' name, which is inferred from the redirect URL.",[19,40450,40451],{},[1603,40452],{"alt":11593,"src":40453},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_google_developer_app_and_get_oauth_2_credentials-2.png",{"title":107,"searchDepth":126,"depth":126,"links":40455},[],"> 💡 Note that if you use `Restricted` or `Sensitive` Scopes you need to contact Unified's Support to setup a CNAME for the API URL in order to get your App...",{"img":40458,"date":40459,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_google_developer_app_and_get_oauth_2_credentials-icon.png","2025-05-29T00:00:00.000Z","/guides/how_to_register_a_google_developer_app_and_get_oauth_2_credentials",{"title":40155,"description":40456},"guides/how_to_register_a_google_developer_app_and_get_oauth_2_credentials","uD5s-qyXH6-RL4Pd7ic9RWq5PbAOh7FOdydtHs55pbk",{"id":40465,"title":40466,"body":40467,"description":40590,"extension":1576,"meta":40591,"navigation":271,"path":40593,"seo":40594,"stem":40595,"__hash__":40596},"guides/guides/how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials.md","How to Register a HighLevel Developer App and Get OAUTH2 Credentials",{"type":9,"value":40468,"toc":40582},[40469,40472,40474,40478,40481,40484,40488,40495,40498,40502,40505,40508,40512,40515,40518,40540,40543,40551,40554,40561,40565],[12,40470,40466],{"id":40471},"how-to-register-a-highlevel-developer-app-and-get-oauth2-credentials",[16,40473],{},[19,40475,40476],{},[22,40477,35017],{},[19,40479,40480],{},"HighLevel is a powerful platform that helps you create and manage marketing campaigns, sales funnels, websites, and more. If you are a developer who wants to build data integrations for your SaaS software, you need to register a HighLevel developer app and get credentials to access the HighLevel API.",[19,40482,40483],{},"In this article, I will show you how to do that step by step.",[67,40485,40487],{"id":40486},"step-1-create-a-highlevel-account","Step 1: Create a HighLevel Account",[19,40489,40490,40491],{},"If you don't have a HighLevel account yet, you need to create one first. You can sign up for a free 14-day trial here: ",[1614,40492,40493],{"href":40493,"rel":40494},"https://www.gohighlevel.com/",[1618],[19,40496,40497],{},"Once you have an account, you can log in to your HighLevel dashboard and click on the \"Settings\" icon on the top right corner.",[67,40499,40501],{"id":40500},"step-2-go-to-the-developer-portal","Step 2: Go to the Developer Portal",[19,40503,40504],{},"On the settings page, you will see a menu on the left side. Click on the \"Developer\" option to go to the developer portal.",[19,40506,40507],{},"Here, you will see a list of your existing developer apps, if any, and a button to create a new one.",[67,40509,40511],{"id":40510},"step-3-create-a-new-developer-app","Step 3: Create a New Developer App",[19,40513,40514],{},"Click on the \"Create New App\" button to start the process of registering a new developer app.",[19,40516,40517],{},"You will need to provide some basic information about your app, such as:",[72,40519,40520,40523,40526,40529,40532,40535],{},[46,40521,40522],{},"App name: A unique name for your app that will be displayed to the users.",[46,40524,40525],{},"App description: A brief description of what your app does and how it integrates with HighLevel.",[46,40527,40528],{},"App URL: The URL of your app's website or landing page, where users can learn more about your app and sign up for it.",[46,40530,40531],{},"Scopes: The permissions that your app requests from the users, such as read and write access to their contacts, campaigns, etc.",[46,40533,40534],{},"Click on the 'Add' button in the Client Keys section and you will get new OAUTH2 credentials",[46,40536,40537,40538],{},"Redirect URL: The URL where HighLevel will redirect the users after they authorize your app to access their data. If you are going to use Unified.to, then this needs to be ",[109,40539,34368],{},[19,40541,40542],{},"After filling out the required fields, click on the \"Create App\" button to submit your app for approval.",[67,40544,40546,40547,40550],{"id":40545},"step-4-how-to-use-unifiedto-apis-for-salesflare-integration","Step 4: How to Use ",[1614,40548,1640],{"href":1638,"rel":40549},[1618]," APIs for Salesflare Integration?",[19,40552,40553],{},"Using HighLevel APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",[19,40555,40556,40557,40560],{},"A simpler and faster alternative is to use ",[1614,40558,1640],{"href":1638,"rel":40559},[1618]," APIs for CRM integration. It provides a unified set of APIs, data-models, and webhooks for 20+ CRM integrations.",[67,40562,40564],{"id":40563},"step-5-activate-workday-in-unifiedto","Step 5: Activate Workday in Unified.to",[43,40566,40567,40573,40576,40579],{},[46,40568,9735,40569],{},[1614,40570,40572],{"href":9741,"rel":40571},[1618],"Active Integrations",[46,40574,40575],{},"Search for HighLevel",[46,40577,40578],{},"Click on Activate on HighLevel",[46,40580,40581],{},"Enter in the information from the previous step (client ID, secret)",{"title":107,"searchDepth":126,"depth":126,"links":40583},[40584,40585,40586,40587,40589],{"id":40486,"depth":126,"text":40487},{"id":40500,"depth":126,"text":40501},{"id":40510,"depth":126,"text":40511},{"id":40545,"depth":126,"text":40588},"Step 4: How to Use Unified.to APIs for Salesflare Integration?",{"id":40563,"depth":126,"text":40564},"HighLevel is a powerful platform that helps you create and manage marketing campaigns, sales funnels, websites, and more. If you are a developer who wants to...",{"img":40592,"date":35287,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials-icon.png","/guides/how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials",{"title":40466,"description":40590},"guides/how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials","PMA8GzFQ0PJV1Rh7E2HDHM_V2JLQwpLtr5vDoCcvJkc",{"id":40598,"title":40599,"body":40600,"description":40893,"extension":1576,"meta":40894,"navigation":271,"path":40896,"seo":40897,"stem":40898,"__hash__":40899},"guides/guides/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials.md","How to register a Salesforce developer app and get OAuth 2 credentials",{"type":9,"value":40601,"toc":40886},[40602,40605,40607,40611,40618,40621,40625,40628,40631,40645,40649,40657,40810,40814,40817,40823,40827,40858,40861,40865],[12,40603,40599],{"id":40604},"how-to-register-a-salesforce-developer-app-and-get-oauth-2-credentials",[16,40606],{},[19,40608,40609],{},[22,40610,35017],{},[19,40612,40613,40614,40617],{},"In this guide, we'll walk you through how to register a Salesforce developer app to get the OAuth 2 credentials you'll need to be a Salesforce integration for your product. Whether you're planning to build a custom-code integration or using a Unified API solution like ",[1614,40615,1640],{"href":1638,"rel":40616},[1618],", retrieving your OAuth 2 credentials is the first step in the process of integrating with Salesforce.",[19,40619,40620],{},"We'll also added directional for existing Unified.to users that are leveraging our Unified CRM API for a faster integration development process.",[67,40622,40624],{"id":40623},"what-is-a-salesforce-developer-app","What is a Salesforce Developer App?",[19,40626,40627],{},"A Salesforce developer app is a container for one or more developer apps. A developer app is an application that can access Salesforce data or functionality through the Salesforce REST, SOAP, or Streaming APIs.",[19,40629,40630],{},"A connected app defines the following information:",[72,40632,40633,40636,40639,40642],{},[46,40634,40635],{},"The name and logo of the app",[46,40637,40638],{},"The OAuth settings for the app, such as the callback URL, the scopes, and the refresh token policy",[46,40640,40641],{},"The API version and the endpoints for the app",[46,40643,40644],{},"The user profiles or permission sets that can access the app\nBy registering a developer app, you can generate a client ID and a client secret, which are the credentials you'll need to authenticate your requests to the Salesforce APIs",[67,40646,40648],{"id":40647},"step-1-register-a-salesforce-developer-app","Step 1: Register a Salesforce developer app",[19,40650,40651,40652,40656],{},"To register a Salesforce developer app, you'll need a Salesforce developer account. If you don't have one, sign up for free at ",[1614,40653,40654],{"href":40654,"rel":40655},"https://developer.salesforce.com/signup",[1618],".\nOnce you have a developer account, follow these steps to register a developer app:",[43,40658,40659,40670,40677,40683,40686,40695,40702,40717,40744,40761,40769,40773,40789,40799],{},[46,40660,40661,40662,40665,40667],{},"Log in to your Salesforce developer account and go to ",[478,40663,40664],{},"Setup",[17180,40666],{},[1603,40668],{"alt":13589,"src":40669},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-0.png",[46,40671,40672,40673,40676],{},"In the Quick Find box, search for ",[478,40674,40675],{},"App Manager"," and click on it",[46,40678,17167,40679,40682],{},[478,40680,40681],{},"New External Client App"," button",[46,40684,40685],{},"Fill in the basic information for your app, such as the name, contact email, and logo URL",[46,40687,12267,40688,40691,40692],{},[109,40689,40690],{},"Packaged"," in ",[478,40693,40694],{},"Distribution State",[46,40696,40697,40698,40701],{},"In the API (Enable OAuth Settings) section, check the ",[478,40699,40700],{},"Enable OAuth Settings"," checkbox",[46,40703,40704,40705,40708,40709,1046,40711,9571,40714,634],{},"Enter the callback URL for your app (this is the URL that Salesforce will redirect the user to after they authorize your app). For ",[1614,40706,1640],{"href":1638,"rel":40707},[1618]," users, the callback URL needs to be ",[109,40710,34368],{},[109,40712,40713],{},"https://api-eu.unified.to/oauth/code",[109,40715,40716],{},"https://api-au.unified.to/oauth/code",[46,40718,40719,40720,40723,40724,11338,40727,40730,40731,4877,40733,4877,40736,40738,40739,40741],{},"Select the OAuth scopes for your app (these are the permissions that your app will request from the user). To set up ",[1614,40721,1640],{"href":1638,"rel":40722},[1618]," successfully you'll need to add these OAuth Scopes: ",[109,40725,40726],{},"Manage user data via APIs (api)",[109,40728,40729],{},"Platform requests at any time (refresh_token, offline_access)",".  If you are also going to use Salesforce to sign-in your users into your application, then also set the ",[109,40732,36897],{},[109,40734,40735],{},"profile",[109,40737,666],{},"scopes.",[17180,40740],{},[1603,40742],{"alt":13589,"src":40743},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-1.png",[46,40745,40746,40747],{},"Next, enable the following options for you app:",[43,40748,40749,40752,40755,40758],{},[46,40750,40751],{},"Enable Authorization Code and Credentials Flow",[46,40753,40754],{},"Require user credentials in the POST body for Authorization Code and Credentials Flow",[46,40756,40757],{},"Require Secret for Web Server Flow",[46,40759,40760],{},"Require Secret for Refresh Token Flow",[46,40762,40763,40764,40766],{},"Do NOT enable CODE CHALLENGE (Require Proof Key for Code Exchange (PKCE) Extension for Supported Authorization Flows)",[17180,40765],{},[1603,40767],{"alt":13589,"src":40768},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-2.png",[46,40770,9757,40771],{},[478,40772,34308],{},[46,40774,40775,40776,40779,40780,40783,40784,40786],{},"Next click ",[478,40777,40778],{},"Edit"," under ",[478,40781,40782],{},"Policies"," tab",[17180,40785],{},[1603,40787],{"alt":13589,"src":40788},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-3.png",[46,40790,40791,40792,40794,40796],{},"Set 'Refresh token is valid until revoked' and click ",[478,40793,31780],{},[17180,40795],{},[1603,40797],{"alt":13589,"src":40798},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-4.png",[46,40800,40801,40802,634,40805,40807],{},"Lastly, go to Settings tab and retrieve you 'Consumer Key' (client ID) and 'Consumer Secret' (client secret).You will need these credentials to activate your Salesforce integration in ",[1614,40803,1640],{"href":1638,"rel":40804},[1618],[17180,40806],{},[1603,40808],{"alt":13589,"src":40809},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-5.png",[67,40811,40813],{"id":40812},"step-2-use-unifiedto-to-simplify-integration-development","Step 2: Use Unified.to to Simplify Integration Development",[19,40815,40816],{},"Using Salesforce APIs directly can be a complex and time-consuming process, especially if you plan to integrate with other leading CRM platforms like HubSpot, ActiveCampaign, and Copper. Without Unified.to, you'll be tasked with handling authentication, error handling, rate limiting, data mapping, and the synchronization logic for each individual integration.",[19,40818,40819,40822],{},[1614,40820,1640],{"href":1638,"rel":40821},[1618]," simplifies this entire process, providing SaaS developers with a unified set of APIs, data models, and webhooks for 20+ CRM integrations. Add all the CRM integrations on your roadmap in a matter of hours.",[67,40824,40826],{"id":40825},"step-3-activate-salesforce-in-unifiedto-for-unifiedto-users","Step 3: Activate Salesforce in Unified.to (for Unified.to users)",[43,40828,40829,40841,40850,40855],{},[46,40830,40831,40835,40836],{},[1614,40832,40834],{"href":12214,"rel":40833},[1618],"Log in"," and navigate to ",[1614,40837,40839],{"href":9741,"rel":40838},[1618],[478,40840,40572],{},[46,40842,40843,40844,40846,40847],{},"Use the search bar or click the ",[478,40845,13099],{}," tab to select ",[478,40848,40849],{},"Salesforce",[46,40851,9757,40852,40854],{},[478,40853,9760],{}," on Salesforce",[46,40856,40857],{},"Enter the information from the previous step (client ID, client secret)",[19,40859,40860],{},"Once you've activated Salesforce along with other integrations, you'll be able to add integrations to your product using our low-code authorization UI embed.",[67,40862,40864],{"id":40863},"one-api-to-integrate-them-all","One API to integrate them all",[19,40866,40867,40868,16309,40873,16316,40879,40884],{},"You're reading this article on the ",[1614,40869,40871],{"href":1638,"rel":40870},[1618],[478,40872,1640],{},[1614,40874,40877],{"href":40875,"rel":40876},"https://app.unified.to/login?utm_source=blog&utm_medium=blog_signup_salesforce&utm_campaign=blog_signup&utm_id=blog_signup",[1618],[478,40878,16315],{},[1614,40880,40882],{"href":16319,"rel":40881},[1618],[478,40883,16323],{},[478,40885,634],{},{"title":107,"searchDepth":126,"depth":126,"links":40887},[40888,40889,40890,40891,40892],{"id":40623,"depth":126,"text":40624},{"id":40647,"depth":126,"text":40648},{"id":40812,"depth":126,"text":40813},{"id":40825,"depth":126,"text":40826},{"id":40863,"depth":126,"text":40864},"In this guide, we'll walk you through how to register a Salesforce developer app to get the OAuth 2 credentials you'll need to be a Salesforce integration for...",{"img":40895,"date":35287,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-icon.png","/guides/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials",{"title":40599,"description":40893},"guides/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials","KG-5-Z-Gt4i8xAYvPB2uTfPxGqoIUTEQ-cmTRUBH3XY",{"id":40901,"title":40902,"body":40903,"description":40917,"extension":1576,"meta":41195,"navigation":271,"path":41198,"seo":41199,"stem":41200,"__hash__":41201},"guides/guides/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials.md","How to register a Slack developer account and get OAuth 2 credentials",{"type":9,"value":40904,"toc":41189},[40905,40908,40910,40915,40918,40920,40922,40930,40934,40969,40972,40978,40983,40987,40990,41064,41068,41086,41090,41170,41184,41187],[12,40906,40902],{"id":40907},"how-to-register-a-slack-developer-account-and-get-oauth-2-credentials",[16,40909],{},[19,40911,40912],{},[22,40913,40914],{},"January 3, 2025",[19,40916,40917],{},"This guide walks you through how to register a Slack developer account, obtain OAuth 2 credentials, and configure scopes for your application.",[67,40919,13634],{"id":13633},[19,40921,17040],{},[72,40923,40924,40927],{},[46,40925,40926],{},"A Slack account",[46,40928,40929],{},"Admin access to a Slack workspace where you can test your app",[67,40931,40933],{"id":40932},"create-a-slack-app","Create a Slack app",[43,40935,40936,40944,40948,40953,40956,40959],{},[46,40937,9900,40938,40943],{},[1614,40939,40942],{"href":40940,"rel":40941},"https://api.slack.com/apps",[1618],"Slack API website"," and sign into your Slack account",[46,40945,9757,40946],{},[478,40947,31197],{},[46,40949,12267,40950],{},[478,40951,40952],{},"From scratch",[46,40954,40955],{},"Enter your app's name",[46,40957,40958],{},"Select the workspace where you want to install and test out your app",[46,40960,9757,40961,40963,40965],{},[478,40962,30880],{},[17180,40964],{},[1603,40966],{"alt":40967,"src":40968},"Screenshot_2025-01-03_at_11.13.30_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials-0.png",[19,40970,40971],{},"After you create your app, you'll be redirected to the app's settings page where you can find your Client Id and Client Secret. Make a note of these as you will need them to activate the Slack integration on Unfiied.to.",[19,40973,40974],{},[1603,40975],{"alt":40976,"src":40977},"Screenshot_2025-01-03_at_11.15.20_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials-1.png",[19,40979,40980],{},[22,40981,40982],{},"Note: Store these values securely - never commit them to version control!",[67,40984,40986],{"id":40985},"configure-oauth-2-settings","Configure OAuth 2 settings",[19,40988,40989],{},"In addition to activating the Slack integration, you'll need to configure the redirect URL and enable the correct scopes in order to successfully authorize a connection with Unified.to.",[43,40991,40992,40998,41007,41018,41032],{},[46,40993,40994,40995],{},"From your app's settings page, navigate to ",[478,40996,40997],{},"OAuth & Permissions",[46,40999,25422,41000,35120,41002],{},[478,41001,35119],{},[1614,41003,41005],{"href":34368,"rel":41004},[1618],[109,41006,34368],{},[46,41008,9757,41009,41012,41014],{},[478,41010,41011],{},"Save URLs",[17180,41013],{},[1603,41015],{"alt":41016,"src":41017},"Screenshot_2025-01-03_at_11.18.11_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials-2.png",[46,41019,41020,41021,41024,41025,41028,41029],{},"If you are using the SlackBot integration, use ",[478,41022,41023],{},"Bot Token Scopes.","  If not, then use ",[478,41026,41027],{},"User Token Scopes.","  click ",[478,41030,41031],{},"Add an OAuth Scope",[46,41033,41034,41035,41040,41041],{},"Search for and add the scopes you need for your application - refer to ",[1614,41036,41039],{"href":41037,"rel":41038},"https://app.unified.to/integrations/slack?tab=oauth2",[1618],"this page ","to see the scopes that are supported by Unified.",[43,41042,41043],{},[46,41044,41045,41046],{},"For example, if you want to read messages, then you should choose the scopes that map to :\n",[43,41047,41048,41056],{},[46,41049,41050,2335,41053],{},[478,41051,41052],{},"messaging_channel_read",[109,41054,41055],{},"im:read, mpim:read, channels:read, groups:read",[46,41057,41058,2335,41061],{},[478,41059,41060],{},"messaging_message_read",[109,41062,41063],{},"im:read, im:history, mpim:read, mpim:history, channels:history, channels:read, groups:read, groups:history",[67,41065,41067],{"id":41066},"activate-the-slack-integration-with-your-credentials","Activate the Slack integration with your credentials",[43,41069,41070,41081,41084],{},[46,41071,33699,41072,41076,41077],{},[1614,41073,41074],{"href":41074,"rel":41075},"https://app.unified.to/integrations/slack?tab=auth",[1618]," or  ",[1614,41078,41080],{"href":41074,"rel":41079},[1618],"https://app.unified.to/integrations/slackbot?tab=auth",[46,41082,41083],{},"Enter your Client ID and Client secret from the steps above",[46,41085,36996],{},[12,41087,41089],{"id":41088},"for-a-slack-bot-follow-these-additional-instructions","For a Slack Bot, follow these additional instructions",[43,41091,41092,41098,41109,41119,41126,41133,41140,41146,41160,41165],{},[46,41093,41094,41095],{},"In the left sidebar, go to ",[478,41096,41097],{},"\"App Home\"",[46,41099,36311,41100,36315,41103,16316,41106],{},[478,41101,41102],{},"\"Your App's Presence in Slack\"",[478,41104,41105],{},"\"Add\"",[478,41107,41108],{},"\"Edit\"",[46,41110,41111,41112,33518,41115,41118],{},"Set a ",[478,41113,41114],{},"Display Name",[478,41116,41117],{},"Default Username"," for your bot",[46,41120,41121,41122,41125],{},"Toggle on ",[478,41123,41124],{},"\"Always Show My Bot as Online\""," (optional)",[46,41127,41128,41129,41132],{},"Go to ",[478,41130,41131],{},"\"Event Subscriptions\""," in sidebar",[46,41134,41135,41136,41139],{},"Toggle ",[478,41137,41138],{},"\"Enable Events\""," to On",[46,41141,41142,41143],{},"Enter the Unified webhook URL ",[109,41144,41145],{},"https://api.unified.to/webhook/workspace/slackbot?workspace_id={ID}",[46,41147,41148,41149],{},"Subscribe to most bot events like:\n",[72,41150,41151,41154,41157],{},[46,41152,41153],{},"message.channels",[46,41155,41156],{},"app_mention",[46,41158,41159],{},"message.im",[46,41161,33699,41162],{},[478,41163,41164],{},"\"Interactivity & Shortcuts\" to enable receiving information about button events",[46,41166,41167,41168],{},"Toggle On and enter in ",[109,41169,41145],{},[19,41171,41172,41173,41176,41177,41180,41181,32268],{},"When a user authorizes your ",[109,41174,41175],{},"slackbot"," integration, their user ID will be stored in ",[109,41178,41179],{},"connection.auth.user_id"," and the bot ID will be stored in ",[109,41182,41183],{},"connection.auth.app_id",[19,41185,41186],{},"Congratulations, you're now ready to use the Slack integration in your application.",[19,41188,20468],{},{"title":107,"searchDepth":126,"depth":126,"links":41190},[41191,41192,41193,41194],{"id":13633,"depth":126,"text":13634},{"id":40932,"depth":126,"text":40933},{"id":40985,"depth":126,"text":40986},{"id":41066,"depth":126,"text":41067},{"img":41196,"date":41197,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials-icon.png","2025-01-03T00:00:00.000Z","/guides/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials",{"title":40902,"description":40917},"guides/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials","7vn6IkDMuBJy0xKutfMQ_wE6TGGF5u74jTzvJExZKgU",{"id":41203,"title":41204,"body":41205,"description":41327,"extension":1576,"meta":41328,"navigation":271,"path":41331,"seo":41332,"stem":41333,"__hash__":41334},"guides/guides/how_to_register_a_workday_developer_app_and_get_oauth2_credentials.md","How to Register a Workday Developer App and Get OAUTH2 Credentials",{"type":9,"value":41206,"toc":41321},[41207,41210,41212,41217,41220,41223,41227,41284,41292,41295,41301,41305],[12,41208,41204],{"id":41209},"how-to-register-a-workday-developer-app-and-get-oauth2-credentials",[16,41211],{},[19,41213,41214],{},[22,41215,41216],{},"March 13, 2023",[19,41218,41219],{},"As a developer of an application in the HR space, you absolutely need to have a Workday integration so that you can access your customers' data in the most popular HRIS vendor, Workday.",[19,41221,41222],{},"Before you can use Unified.to's HRIS and ATS unified APIs with Workday, you must get your customer to generate Workday API credentials for your application.",[67,41224,41226],{"id":41225},"register-a-new-api-client-in-workday","Register a new API Client in Workday",[43,41228,41229,41232,41235,41259,41267,41270,41273,41281],{},[46,41230,41231],{},"Sign-in to the Workday tenant",[46,41233,41234],{},"Search for 'Register API Client for Integration' using the search bar",[46,41236,41237,41238,41254,41256],{},"Fill out the requested inputs with the following example details:",[43,41239,41240,41245,41248,41251],{},[46,41241,41242,41243],{},"Client Name; ",[9813,41244],{"application":107,"name":107},[46,41246,41247],{},"Refresh Token Timeout; 0 days (ie. never)",[46,41249,41250],{},"Non-Expiring Refresh Token: Checked",[46,41252,41253],{},"Scope: Choose all of the permission scopes for the use-case.  Minimum should be Worker/Employee access",[17180,41255],{},[1603,41257],{"alt":13589,"src":41258},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_credentials-0.png",[46,41260,41261,41262,41264],{},"Once the API client has been registered, go to 'Related Actions' icon ⇒ 'API Client' ⇒ 'Manage Refresh Tokens for Integrations'",[17180,41263],{},[1603,41265],{"alt":13589,"src":41266},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_credentials-1.png",[46,41268,41269],{},"Remember the Client ID and Client Secret",[46,41271,41272],{},"Enter the 'Integration System User (ISU)' in the Workday Account field. This ISU needs to have access to all of the resources that you need for the API.",[46,41274,41275,41276,41278],{},"Check the \"Regenerate New Refresh Token\" box and click OK.",[17180,41277],{},[1603,41279],{"alt":13589,"src":41280},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_credentials-2.png",[46,41282,41283],{},"A new refresh token will be generated.  Remember that Refresh Token.",[67,41285,41287,41288,41291],{"id":41286},"use-unifiedto-to-simplify-your-integrations-development","Use ",[1614,41289,1640],{"href":1638,"rel":41290},[1618]," to Simplify your Integrations Development",[19,41293,41294],{},"Using Workday APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",[19,41296,40556,41297,41300],{},[1614,41298,1640],{"href":1638,"rel":41299},[1618]," APIs for HRIS and ATS integrations. It provides a unified set of APIs, data-models, and webhooks for most of the HRIS and ATS integrations.",[67,41302,41304],{"id":41303},"activate-workday-in-unifiedto","Activate Workday in Unified.to",[43,41306,41307,41312,41315,41318],{},[46,41308,9735,41309],{},[1614,41310,40572],{"href":9741,"rel":41311},[1618],[46,41313,41314],{},"Search for Workday",[46,41316,41317],{},"Click on Activate on Workday",[46,41319,41320],{},"Enter in the information from the previous step (client ID, secret, endpoints/URLs)",{"title":107,"searchDepth":126,"depth":126,"links":41322},[41323,41324,41326],{"id":41225,"depth":126,"text":41226},{"id":41286,"depth":126,"text":41325},"Use Unified.to to Simplify your Integrations Development",{"id":41303,"depth":126,"text":41304},"As a developer of an application in the HR space, you absolutely need to have a Workday integration so that you can access your customers' data in the most...",{"img":41329,"date":41330,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_credentials-icon.png","2023-03-13T00:00:00.000Z","/guides/how_to_register_a_workday_developer_app_and_get_oauth2_credentials",{"title":41204,"description":41327},"guides/how_to_register_a_workday_developer_app_and_get_oauth2_credentials","ykkq82rEDe6M3Pj2OaT_VDRBys5gunTkRqhumm0-Z-I",{"id":41336,"title":41337,"body":41338,"description":41564,"extension":1576,"meta":41565,"navigation":271,"path":41567,"seo":41568,"stem":41569,"__hash__":41570},"guides/guides/how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials.md","How to Register a Workday Developer App and Get OAUTH2/ SOAP Credentials",{"type":9,"value":41339,"toc":41555},[41340,41343,41345,41350,41357,41360,41371,41374,41380,41384,41420,41423,41428,41431,41437,41448,41455,41461,41465,41491,41495,41521,41525],[12,41341,41337],{"id":41342},"how-to-register-a-workday-developer-app-and-get-oauth2-soap-credentials",[16,41344],{},[19,41346,41347],{},[22,41348,41349],{},"November 10, 2025",[12,41351,41353,41354],{"id":41352},"how-to-register-and-get-oauth2-credentials-for-workday","How to Register and Get OAUTH2 ",[478,41355,41356],{},"Credentials for Workday:",[19,41358,41359],{},"You will need 3 endpoints (URLs):",[72,41361,41362,41365,41368],{},[46,41363,41364],{},"REST API Endpoint",[46,41366,41367],{},"Token Endpoint",[46,41369,41370],{},"Authorization Endpoint",[19,41372,41373],{},"You will also need:",[72,41375,41376,41378],{},[46,41377,30971],{},[46,41379,30976],{},[35,41381,41383],{"id":41382},"how-to-setup-client-id","How to setup Client ID",[43,41385,41386,41391,41394,41397,41399,41402,41405,41411,41414,41417],{},[46,41387,41388],{},[478,41389,41390],{},"Log in to the Workday application",[46,41392,41393],{},"Register API Client: Navigate to the \"Register API Client\" section",[46,41395,41396],{},"Select the Register API Client form",[46,41398,41396],{},[46,41400,41401],{},"For the grant type, select \"Authorization Code Grant'",[46,41403,41404],{},"For the access token type, select \"Bearer'",[46,41406,41407,41408,33910],{},"In the Redirection URI field, enter \"",[1614,41409,34368],{"href":34368,"rel":41410},[1618],[46,41412,41413],{},"In the Scope section, add Staffing and/or Recruiting, depending on your application's needs",[46,41415,41416],{},"Select \"Non-expiring Refresh Tokens'",[46,41418,41419],{},"Select the Include Workday Owned Scope checkbox.",[19,41421,41422],{},"Click OK to save the app.",[19,41424,41425],{},[1603,41426],{"alt":13589,"src":41427},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials-0.png",[19,41429,41430],{},"Once you create your application, Workday will display the information that you entered plus additional information.",[35,41432,41434],{"id":41433},"retrieve-endpoints",[478,41435,41436],{},"Retrieve Endpoints",[43,41438,41439,41442,41445],{},[46,41440,41441],{},"Access \"View API Clients\"",[46,41443,41444],{},"Use the Workday search bar to navigate to \"View API clients\"",[46,41446,41447],{},"Retrieve REST API Endpoint, Token Endpoint, Authorization Endpoint",[12,41449,41353,41451,41454],{"id":41450},"how-to-register-and-get-oauth2-credentials-for-workday-legacy",[478,41452,41453],{},"Credentials for Workday Legacy",":-",[67,41456,41458],{"id":41457},"integration-system-userisu",[478,41459,41460],{},"Integration System User(ISU)",[35,41462,41464],{"id":41463},"create-user","Create User",[43,41466,41467,41470,41473,41476,41479,41482,41485,41488],{},[46,41468,41469],{},"Log in to the Workday tenant",[46,41471,41472],{},"search 'Create Integration System User'.",[46,41474,41475],{},"Goto 'Create Integration System User'",[46,41477,41478],{},"In the \"Create Integration System User\" page, go to the \"Account Information\" section.",[46,41480,41481],{},"Provide Username & Password",[46,41483,41484],{},"Require New Password  should remain unchecked",[46,41486,41487],{},"Type 0 (zero) for Session Timeout Minutes to prevent session expiration",[46,41489,41490],{},"Click \"OK\" to save.",[35,41492,41494],{"id":41493},"provide-permissions-to-isu","Provide permissions to ISU",[43,41496,41497,41500,41503,41506,41509,41512,41515,41518],{},[46,41498,41499],{},"Search field, type \"Create Security Group'",[46,41501,41502],{},"Select \"Integration System Security Group\" from the \"Type of Tenanted Security Group\" drop-down menu.",[46,41504,41505],{},"In the \"Name\" field, enter a name for the security group.",[46,41507,41508],{},"Integration System Security Group on Workday select 'Maintain Permissions for Security Group''",[46,41510,41511],{},"Configure the Permissions and select \"Maintain' Operation",[46,41513,41514],{},"\"Source Security Group\" name matches your created security group.",[46,41516,41517],{},"Now add Domain Security Policy Permissions",[46,41519,41520],{},"Search 'Activate Pending Security Policy Changes'",[35,41522,41524],{"id":41523},"wsdl-url","WSDL URL",[43,41526,41527,41530,41535,41538,41541,41544],{},[46,41528,41529],{},"Go to Workday, search 'Public Web Services'.",[46,41531,9757,41532,25059],{},[478,41533,41534],{},"\"Public Web Services Report",[46,41536,41537],{},"Hover over the \"Human Resources\" section.",[46,41539,41540],{},"Click the three dots to open the menu.",[46,41542,41543],{},"Select \"Web Services\" and then click \"View WSDL'",[46,41545,41546,41547,41553],{},"Goto bottom of the page and get host URL. That looks like following:- ",[1614,41548,41551],{"href":41549,"rel":41550},"https://wd5-services1.myworkday.com/ccx",[1618],[478,41552,41549],{},[478,41554,634],{},{"title":107,"searchDepth":126,"depth":126,"links":41556},[41557,41558,41559],{"id":41382,"depth":135,"text":41383},{"id":41433,"depth":135,"text":41436},{"id":41457,"depth":126,"text":41460,"children":41560},[41561,41562,41563],{"id":41463,"depth":135,"text":41464},{"id":41493,"depth":135,"text":41494},{"id":41523,"depth":135,"text":41524},"2. Register API Client, Navigate to the \"Register API Client\" section",{"img":31148,"date":41566,"tag":1580},"2025-11-10T19:03:00.000Z","/guides/how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials",{"title":41337,"description":41564},"guides/how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials","oe78VTIVTIMpkfk6x9sGwa5wwfPwcbD6r927QbdC9OQ",{"id":41572,"title":41573,"body":41574,"description":41699,"extension":1576,"meta":41700,"navigation":271,"path":41702,"seo":41703,"stem":41704,"__hash__":41705},"guides/guides/how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials.md","How to Register a ZendeskSell Developer App and Get OAUTH2 Credentials",{"type":9,"value":41575,"toc":41691},[41576,41579,41581,41585,41588,41591,41595,41603,41606,41610,41613,41618,41621,41632,41635,41638,41642,41645,41648,41656,41659,41666,41669,41674,41676],[12,41577,41573],{"id":41578},"how-to-register-a-zendesksell-developer-app-and-get-oauth2-credentials",[16,41580],{},[19,41582,41583],{},[22,41584,35017],{},[19,41586,41587],{},"If you are a developer who wants to build data integrations for your SaaS software, you might be interested in using the ZendeskSell API. The ZendeskSell API allows you to access and manipulate data from ZendeskSell, a powerful CRM platform that helps you manage your sales pipeline, contacts, deals, and tasks.",[19,41589,41590],{},"However, before you can use the ZendeskSell API, you need to register a developer app and get credentials. In this article, I will show you how to do that in a few simple steps.",[67,41592,41594],{"id":41593},"step-1-create-a-zendesksell-account","Step 1: Create a ZendeskSell account",[19,41596,41597,41598],{},"If you don't have a ZendeskSell account yet, you need to create one first. You can sign up for a free trial here: ",[1614,41599,41602],{"href":41600,"rel":41601},"https://www.zendesk.com/register/",[1618],"https://www.zendesk.com/register/?source=zendesk_sell",[19,41604,41605],{},"Once you have created your account, you can log in to your ZendeskSell dashboard and access the settings menu.",[67,41607,41609],{"id":41608},"step-2-register-a-developer-app","Step 2: Register a developer app",[19,41611,41612],{},"To register a developer app, you need to go to the Admin Settings and click on \"APIs > Zendesk APIs\" and then on 'Oauth Clients'. Then, you need to click on the \"Add OAUTH2 Client\" button and fill in the required information.",[19,41614,41615,41616],{},"You need to provide a name, a description, a logo URL, and a redirect URI for your app. The redirect URI is the URL where ZendeskSell will send the authorization code after the user grants permission to your app. You can use any URL that you control, but it must match the one you will use in your code later. If you are going to use Unified.to, then this needs to be ",[109,41617,34368],{},[19,41619,41620],{},"You also need to select the scopes that your app will need to access the ZendeskSell data. The scopes are the permissions that define what your app can do with the ZendeskSell API. You can choose from the following scopes:",[72,41622,41623,41626,41629],{},[46,41624,41625],{},"read: Allows your app to read data from ZendeskSell",[46,41627,41628],{},"write: Allows your app to write data to ZendeskSell",[46,41630,41631],{},"delete: Allows your app to delete data from ZendeskSell",[19,41633,41634],{},"You can select one or more scopes depending on your app's functionality. However, you should only request the minimum scopes that your app needs to avoid unnecessary access.",[19,41636,41637],{},"After you fill in the information, you can click on the \"Register App\" button and your app will be created.",[67,41639,41641],{"id":41640},"step-3-get-credentials","Step 3: Get credentials",[19,41643,41644],{},"Once you have registered your app, you will see a confirmation page with your app's credentials. You will need these credentials to authenticate your app with the ZendeskSell API.",[19,41646,41647],{},"The credentials are:",[72,41649,41650,41653],{},[46,41651,41652],{},"Client ID: A unique identifier for your app",[46,41654,41655],{},"Client Secret: A secret key that you should keep confidential and never share with anyone",[19,41657,41658],{},"You should copy and save these credentials somewhere safe, as you will need them later in your code.",[67,41660,41662,41663,41291],{"id":41661},"step-4-use-unifiedto-to-simplify-your-integrations-development","Step 4: Use ",[1614,41664,1640],{"href":1638,"rel":41665},[1618],[19,41667,41668],{},"Using ZendeskSell APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",[19,41670,40556,41671,40560],{},[1614,41672,1640],{"href":1638,"rel":41673},[1618],[67,41675,40564],{"id":40563},[43,41677,41678,41683,41686,41689],{},[46,41679,9735,41680],{},[1614,41681,40572],{"href":9741,"rel":41682},[1618],[46,41684,41685],{},"Search for ZendeskSell",[46,41687,41688],{},"Click on Activate on ZendeskSell",[46,41690,40581],{},{"title":107,"searchDepth":126,"depth":126,"links":41692},[41693,41694,41695,41696,41698],{"id":41593,"depth":126,"text":41594},{"id":41608,"depth":126,"text":41609},{"id":41640,"depth":126,"text":41641},{"id":41661,"depth":126,"text":41697},"Step 4: Use Unified.to to Simplify your Integrations Development",{"id":40563,"depth":126,"text":40564},"If you are a developer who wants to build data integrations for your SaaS software, you might be interested in using the ZendeskSell API. The ZendeskSell API...",{"img":41701,"date":35287,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials-icon.svg","/guides/how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials",{"title":41573,"description":41699},"guides/how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials","nYGvjOCed9-N_fWGQ33_i6T7Xtm2PBslom40Aaryt-A",{"id":41707,"title":41708,"body":41709,"description":41815,"extension":1576,"meta":41816,"navigation":271,"path":41819,"seo":41820,"stem":41821,"__hash__":41822},"guides/guides/how_to_register_a_zoho_developer_app_and_get_oauth2_credentials.md","How to Register a Zoho Developer App and Get OAUTH2 Credentials",{"type":9,"value":41710,"toc":41809},[41711,41714,41716,41721,41724,41727,41731,41738,41741,41745,41748,41781,41784,41791],[12,41712,41708],{"id":41713},"how-to-register-a-zoho-developer-app-and-get-oauth2-credentials",[16,41715],{},[19,41717,41718],{},[22,41719,41720],{},"August 23, 2024",[19,41722,41723],{},"Zoho has many applications that we support integrations with; ZohoCRM, ZohoBooks, ZohoPeople, and ZohoRecruit. If you are a developer who wants to build data integrations for your SaaS software with any of the Zoho product suite, you will need to register a developer app and get credentials from Zoho.",[19,41725,41726],{},"In this article, I will show you how to do that in a few simple steps.",[67,41728,41730],{"id":41729},"step-1-create-a-zoho-developer-account","Step 1: Create a Zoho Developer Account",[19,41732,41733,41734,634],{},"The first step is to create a Zoho Developer account, if you don't have one already. You can sign up for free at ",[1614,41735,41736],{"href":41736,"rel":41737},"https://developer.zoho.com/signup",[1618],[19,41739,41740],{},"Once you have created your account, you will be able to access the Zoho Developer Console, where you can manage your apps and credentials.",[67,41742,41744],{"id":41743},"step-2-register-a-zoho-developer-app","Step 2: Register a Zoho Developer App",[19,41746,41747],{},"The next step is to register a Zoho developer app, which will allow you to access the Zoho API and data. To do that, follow these steps:",[72,41749,41750,41759,41762,41765,41775,41778],{},[46,41751,41752,41753,41758],{},"Go to the ",[1614,41754,41757],{"href":41755,"rel":41756},"https://api-console.zoho.com/",[1618],"Zoho Developer Console"," and click on the \"Add App\" button.",[46,41760,41761],{},"Choose \"Server-Based\" as the Client Type and click on \"Create\".",[46,41763,41764],{},"Enter a name and a homepage for your app",[46,41766,41767,41768,9571,41773],{},"For your Authorized redirect URI, enter in ",[1614,41769,41771],{"href":34368,"rel":41770},[1618],[109,41772,34368],{},[109,41774,40713],{},[46,41776,41777],{},"Click on \"Create\".",[46,41779,41780],{},"You will see a confirmation message and a client ID and a client secret for your app. Copy and save them somewhere safe, as you will need them later.",[19,41782,41783],{},"Congratulations! You have successfully registered a Zoho developer app and got credentials. You can now use them to access the Zoho API and data from your SaaS software.",[67,41785,41787,41788],{"id":41786},"step-3-activate-your-zoho-apps-in-unifiedto","Step 3: Activate your Zoho Apps in ",[1614,41789,1640],{"href":1638,"rel":41790},[1618],[43,41792,41793,41798,41801,41804,41806],{},[46,41794,9735,41795],{},[1614,41796,40572],{"href":9741,"rel":41797},[1618],[46,41799,41800],{},"Search for ZohoCRM, ZohoBooks, ZohoPeople, or ZohoRecruit",[46,41802,41803],{},"Click on the integration",[46,41805,40581],{},[46,41807,41808],{},"Click on Activate",{"title":107,"searchDepth":126,"depth":126,"links":41810},[41811,41812,41813],{"id":41729,"depth":126,"text":41730},{"id":41743,"depth":126,"text":41744},{"id":41786,"depth":126,"text":41814},"Step 3: Activate your Zoho Apps in Unified.to","Zoho has many applications that we support integrations with; ZohoCRM, ZohoBooks, ZohoPeople, and ZohoRecruit. If you are a developer who wants to build data...",{"img":41817,"date":41818,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_zoho_developer_app_and_get_oauth2_credentials-icon.png","2024-08-23T00:00:00.000Z","/guides/how_to_register_a_zoho_developer_app_and_get_oauth2_credentials",{"title":41708,"description":41815},"guides/how_to_register_a_zoho_developer_app_and_get_oauth2_credentials","4mAk92KZg4ADSuVhXvS9ZE8_ghLkt6K_D-5AqVTJ5yI",{"id":41824,"title":41825,"body":41826,"description":41954,"extension":1576,"meta":41955,"navigation":271,"path":41958,"seo":41959,"stem":41960,"__hash__":41961},"guides/guides/how_to_register_an_adp_developer_app_and_get_oauth2_credentials.md","How to Register an ADP Developer App and Get OAUTH2 Credentials",{"type":9,"value":41827,"toc":41947},[41828,41831,41833,41838,41841,41847,41855,41860,41863,41883,41889,41892,41915,41919,41922,41925,41928,41932],[12,41829,41825],{"id":41830},"how-to-register-an-adp-developer-app-and-get-oauth2-credentials",[16,41832],{},[19,41834,41835],{},[22,41836,41837],{},"April 30, 2023",[19,41839,41840],{},"Developers who are looking to build data integrations for their SaaS software will need to register an ADP Developer application and obtain OAUTH2 credentials. This will allow you to access ADP data and build integrations with ADP services. In this article, we'll go over the steps to register an ADP Developer application and obtain OAUTH2 credentials.",[67,41842,41844],{"id":41843},"step-1-create-an-adp-developer-account",[478,41845,41846],{},"Step 1: Create an ADP Developer Account",[19,41848,41849,41850,634],{},"To get started, you will need to create an ADP Developer account. If you don't already have one, you can sign up for free on the ",[1614,41851,41854],{"href":41852,"rel":41853},"https://developers.adp.com/",[1618],"ADP Developer Portal",[67,41856,41857],{"id":41608},[478,41858,41859],{},"Step 2: Register a Developer App",[19,41861,41862],{},"Once you have an ADP Developer account, you can register a new developer app. Here are the steps to do so:",[43,41864,41865,41868,41871,41874,41877,41880],{},[46,41866,41867],{},"Log in to your ADP Developer account.",[46,41869,41870],{},"Navigate to the \"Apps\" section of the Developer Portal.",[46,41872,41873],{},"Click on the \"Register App\" button.",[46,41875,41876],{},"Fill in the required information for your app, such as its name, description, and callback URL.",[46,41878,41879],{},"Agree to the ADP Developer Terms of Service and Privacy Policy.",[46,41881,41882],{},"Click the \"Submit\" button to complete the app registration process.",[67,41884,41886],{"id":41885},"step-3-get-your-app-credentials",[478,41887,41888],{},"Step 3: Get Your App Credentials",[19,41890,41891],{},"Once your app is registered, you can obtain your app credentials, including the Client ID and Client Secret, which are used to authenticate your app and access the ADP APIs.",[43,41893,41894,41896,41899,41902],{},[46,41895,41870],{},[46,41897,41898],{},"Click on the name of the app you just registered.",[46,41900,41901],{},"Click on the \"Credentials\" tab to view your app's Client ID and Client Secret.",[46,41903,41904,41905,41910,41911,41914],{},"Make sure that your redirect_uri is ",[1614,41906,41908],{"href":34368,"rel":41907},[1618],[109,41909,34368],{}," if you are going to use ",[1614,41912,1640],{"href":1638,"rel":41913},[1618]," with these credentials",[67,41916,41918],{"id":41917},"step-4-using-unifiedto","Step 4: Using Unified.to",[19,41920,41921],{},"Registering an ADP Developer application and obtaining OAUTH2 credentials is an important step in building data integration for your SaaS software. With these credentials, you'll be able to access ADP data and build integrations with ADP services.",[19,41923,41924],{},"Using ADP APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",[19,41926,41927],{},"It's much easier to use Unified.to APIs for building scalable integrations. With these APIs, you can focus on building your SaaS software and let Unified.to handle the heavy lifting of integrating with ADP. Check out the Unified.to website for more information on how they can help you build better integrations.",[67,41929,41931],{"id":41930},"step-5-activate-adp-in-unifiedto","Step 5: Activate ADP in Unified.to",[43,41933,41934,41939,41942,41945],{},[46,41935,9735,41936],{},[1614,41937,40572],{"href":9741,"rel":41938},[1618],[46,41940,41941],{},"Search for ADP",[46,41943,41944],{},"Click on Activate on ADP",[46,41946,40581],{},{"title":107,"searchDepth":126,"depth":126,"links":41948},[41949,41950,41951,41952,41953],{"id":41843,"depth":126,"text":41846},{"id":41608,"depth":126,"text":41859},{"id":41885,"depth":126,"text":41888},{"id":41917,"depth":126,"text":41918},{"id":41930,"depth":126,"text":41931},"Developers who are looking to build data integrations for their SaaS software will need to register an ADP Developer application and obtain OAUTH2 credentials....",{"img":41956,"date":41957,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_an_adp_developer_app_and_get_oauth2_credentials-icon.png","2023-04-30T00:00:00.000Z","/guides/how_to_register_an_adp_developer_app_and_get_oauth2_credentials",{"title":41825,"description":41954},"guides/how_to_register_an_adp_developer_app_and_get_oauth2_credentials","Cbgph37ES9da4pTOQ5B_yZRLatSbVtuEVpzWe1uxmqk",{"id":41963,"title":41964,"body":41965,"description":42083,"extension":1576,"meta":42084,"navigation":271,"path":42086,"seo":42087,"stem":42088,"__hash__":42089},"guides/guides/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials.md","How to Register an Atlassian Developer App and Get OAUTH2 Credentials",{"type":9,"value":41966,"toc":42075},[41967,41970,41972,41976,41979,41986,41989,42015,42022,42025,42044,42048,42051,42054,42056,42060],[12,41968,41964],{"id":41969},"how-to-register-an-atlassian-developer-app-and-get-oauth2-credentials",[16,41971],{},[19,41973,41974],{},[22,41975,35017],{},[19,41977,41978],{},"Developers who are looking to build data integrations for their SaaS software with Atlassian services will need to register an Atlassian Developer application and obtain OAUTH2 credentials. This will allow you to access Atlassian data and build integrations with Atlassian services. In this article, we'll go over the steps to register an Atlassian Developer application and obtain OAUTH2 credentials.",[67,41980,41982,41983],{"id":41981},"step-1-registering-an-atlassian-developer-app","Step 1: ",[478,41984,41985],{},"Registering an Atlassian Developer App",[19,41987,41988],{},"To register an Atlassian Developer app, you need to follow the steps below:",[43,41990,41991,42000,42003,42006,42009,42012],{},[46,41992,9900,41993,634],{},[1614,41994,41997],{"href":41995,"rel":41996},"https://developer.atlassian.com/console/myapps/",[1618],[478,41998,41999],{},"Atlassian Developer site",[46,42001,42002],{},"Click on \"Get started\" and create an Atlassian account if you don't have one already.",[46,42004,42005],{},"Navigate to the \"My Atlassian\" page and click on \"Create a new app.\"",[46,42007,42008],{},"Fill out the required information for your app, including the app name, description, and contact information.",[46,42010,42011],{},"Once you have completed the form, click on \"Create app.\"",[46,42013,42014],{},"You will be redirected to the app's overview page, where you can see the app key and client ID.",[67,42016,42018,42019],{"id":42017},"step-2-obtaining-credentials","Step 2: ",[478,42020,42021],{},"Obtaining Credentials",[19,42023,42024],{},"To obtain the necessary credentials for your salesforce integration, you need to do the following:",[43,42026,42027,42030,42033,42038,42041],{},[46,42028,42029],{},"Go to the app's overview page and click on \"Add credentials.\"",[46,42031,42032],{},"Select \"OAuth\" as the authentication method.",[46,42034,42035,42036],{},"Fill out the necessary information, including the callback URL and OAuth scopes.    If you are going to use Unified.to, then this needs to be ",[109,42037,34368],{},[46,42039,42040],{},"Once you have completed the form, click on \"Create credentials.\"",[46,42042,42043],{},"You will be redirected to the credentials page, where you can see the client secret.",[67,42045,42047],{"id":42046},"step-3-using-unifiedto","Step 3: Using Unified.to",[19,42049,42050],{},"Registering an Atlassian Developer application and obtaining OAUTH2 credentials is an important step in building data integration for your SaaS software. With these credentials, you'll be able to access ADP data and build integrations with Atlassian services.",[19,42052,42053],{},"Using Atlassian APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",[19,42055,41927],{},[67,42057,42059],{"id":42058},"step-4-activate-atlassian-in-unifiedto","Step 4: Activate Atlassian in Unified.to",[43,42061,42062,42067,42070,42073],{},[46,42063,9735,42064],{},[1614,42065,40572],{"href":9741,"rel":42066},[1618],[46,42068,42069],{},"Search for Atlassian",[46,42071,42072],{},"Click on Activate on Atlassian",[46,42074,40581],{},{"title":107,"searchDepth":126,"depth":126,"links":42076},[42077,42079,42081,42082],{"id":41981,"depth":126,"text":42078},"Step 1: Registering an Atlassian Developer App",{"id":42017,"depth":126,"text":42080},"Step 2: Obtaining Credentials",{"id":42046,"depth":126,"text":42047},{"id":42058,"depth":126,"text":42059},"Developers who are looking to build data integrations for their SaaS software with Atlassian services will need to register an Atlassian Developer application...",{"img":42085,"date":35287,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials-icon.png","/guides/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials",{"title":41964,"description":42083},"guides/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials","dEWwLPgsQvzE12G32AJum2TzhT7egwEzwHX9lmadFgI",{"id":42091,"title":42092,"body":42093,"description":42400,"extension":1576,"meta":42401,"navigation":271,"path":42403,"seo":42404,"stem":42405,"__hash__":42406},"guides/guides/how_to_register_your_google_ads_oauth2_application.md","How to Register your Google Ads OAuth2 Application",{"type":9,"value":42094,"toc":42397},[42095,42098,42100,42105,42110,42394],[12,42096,42092],{"id":42097},"how-to-register-your-google-ads-oauth2-application",[16,42099],{},[19,42101,42102],{},[22,42103,42104],{},"March 21, 2026",[67,42106,42108],{"id":42107},"how-to-register-your-google-ads-oauth2-application-1",[478,42109,42092],{},[43,42111,42112,42147,42174,42236,42258,42316,42362],{},[46,42113,42114,42115],{},"Create a Google Cloud project\n",[72,42116,42117,42124,42133,42143],{},[46,42118,33699,42119],{},[1614,42120,42122],{"href":36441,"rel":42121},[1618],[478,42123,36441],{},[46,42125,33709,42126,42129,42130],{},[478,42127,42128],{},"Select a project"," at the top of the page, then click ",[478,42131,42132],{},"New Project",[46,42134,31015,42135],{},[72,42136,42137,42140],{},[46,42138,42139],{},"Project Name",[46,42141,42142],{},"Organization (if applicable)",[46,42144,33709,42145],{},[478,42146,34308],{},[46,42148,42149,42150],{},"Enable the Google Ads API\n",[72,42151,42152,42159,42165,42170],{},[46,42153,33699,42154],{},[1614,42155,42157],{"href":40226,"rel":42156},[1618],[478,42158,40226],{},[46,42160,42161,42162],{},"Search for ",[478,42163,42164],{},"Google Ads API",[46,42166,33493,42167,42169],{},[478,42168,42164],{}," in the results",[46,42171,33709,42172],{},[478,42173,36493],{},[46,42175,42176,42177],{},"Configure the OAuth Consent Screen\n",[72,42178,42179,42187,42195,42207,42211,42225,42229,42232],{},[46,42180,33699,42181],{},[1614,42182,42185],{"href":42183,"rel":42184},"https://console.cloud.google.com/apis/credentials/consent",[1618],[478,42186,42183],{},[46,42188,33997,42189,42192,42193],{},[478,42190,42191],{},"External"," as the user type, then click ",[478,42194,34308],{},[46,42196,31015,42197],{},[72,42198,42199,42201,42204],{},[46,42200,30890],{},[46,42202,42203],{},"User Support Email",[46,42205,42206],{},"Developer Contact Email",[46,42208,33709,42209],{},[478,42210,40367],{},[46,42212,42213,42214,42217,42218],{},"On the Scopes step, click ",[478,42215,42216],{},"Add or Remove Scopes"," and add the following scope:\n",[72,42219,42220],{},[46,42221,42222],{},[109,42223,42224],{},"https://www.googleapis.com/auth/adwords",[46,42226,33709,42227],{},[478,42228,40367],{},[46,42230,42231],{},"On the Test Users step, add any Google accounts you want to test with",[46,42233,33709,42234],{},[478,42235,40367],{},[46,42237,42238,42239],{},"Publish the OAuth Consent Screen\n",[72,42240,42241,42249,42255],{},[46,42242,42243,42244],{},"Go back to ",[1614,42245,42247],{"href":42183,"rel":42246},[1618],[478,42248,42183],{},[46,42250,33709,42251,42254],{},[478,42252,42253],{},"Publish App"," to move from Testing to Production status",[46,42256,42257],{},"This allows any Google user to authorize your application, not just the test users you added",[46,42259,42260,42261],{},"Create OAuth2 Credentials\n",[72,42262,42263,42271,42278,42283,42286,42304,42308],{},[46,42264,33699,42265],{},[1614,42266,42269],{"href":42267,"rel":42268},"https://console.cloud.google.com/apis/credentials",[1618],[478,42270,42267],{},[46,42272,33709,42273,42275,42276],{},[478,42274,36517],{}," → ",[478,42277,36521],{},[46,42279,33997,42280,42282],{},[478,42281,36556],{}," as the Application Type",[46,42284,42285],{},"Enter a name for the OAuth client",[46,42287,36311,42288,42291,42292,42294,42295],{},[478,42289,42290],{},"Authorized redirect URIs",", add the following ",[478,42293,1640],{}," OAuth2 redirect URL:\n",[72,42296,42297],{},[46,42298,42299],{},[1614,42300,42302],{"href":34368,"rel":42301},[1618],[478,42303,34368],{},[46,42305,33709,42306],{},[478,42307,34308],{},[46,42309,42310,42311,33518,42313,42315],{},"Copy the ",[478,42312,30971],{},[478,42314,30976],{}," from the dialog that appears",[46,42317,42318,42319],{},"Request Basic Access for the Google Ads Developer Token\n",[72,42320,42321,42340,42346,42356,42359],{},[46,42322,33699,42323,42329],{},[1614,42324,42327],{"href":42325,"rel":42326},"https://ads.google.com/aw/apicenter",[1618],[478,42328,42325],{},[72,42330,42331],{},[46,42332,42333,42334],{},"Note: You must be logged into a Google Ads Manager account. If you do not have one, create one at ",[1614,42335,42338],{"href":42336,"rel":42337},"https://ads.google.com/intl/en/home/tools/manager-accounts/",[1618],[478,42339,42336],{},[46,42341,42342,42343],{},"In the API Center, you will see your ",[478,42344,42345],{},"Developer Token",[46,42347,42348,42349,42352,42353],{},"Your token will initially have ",[478,42350,42351],{},"Test Account"," access. To use it with production accounts, click ",[478,42354,42355],{},"Apply for Basic Access",[46,42357,42358],{},"Fill out the application form with details about how you will use the API",[46,42360,42361],{},"Google typically reviews and approves Basic Access applications within a few business days",[46,42363,42364,42365],{},"Configure Unified.to\n",[72,42366,42367],{},[46,42368,42369,42370,42376,42377],{},"In Unified ",[1614,42371,42374],{"href":42372,"rel":42373},"https://app.unified.to/integrations/googleads",[1618],[478,42375,42372],{},", add the following:\n",[72,42378,42379,42384,42388],{},[46,42380,42381,42382],{},"The OAuth client's ",[478,42383,30971],{},[46,42385,42381,42386],{},[478,42387,30976],{},[46,42389,42390,42391,42393],{},"Your ",[478,42392,42345],{}," from the API Center",[19,42395,42396],{},"You are now all set to authorize a Google Ads connection",{"title":107,"searchDepth":126,"depth":126,"links":42398},[42399],{"id":42107,"depth":126,"text":42092},"Click Select a project at the top of the page, then click New Project...",{"img":31148,"date":42402,"tag":1580},"2026-03-21T02:49:00.000Z","/guides/how_to_register_your_google_ads_oauth2_application",{"title":42092,"description":42400},"guides/how_to_register_your_google_ads_oauth2_application","thdCZnIpMy_bPNntUVlz40OF6t2SAydFZFP5RgBvPng",{"id":42408,"title":42409,"body":42410,"description":42661,"extension":1576,"meta":42662,"navigation":271,"path":42665,"seo":42666,"stem":42667,"__hash__":42668},"guides/guides/how_to_register_your_metaads_oauth2_application.md","How to Register your MetaAds OAuth2 application",{"type":9,"value":42411,"toc":42659},[42412,42415,42417,42422,42557,42562,42590,42595,42656],[12,42413,42409],{"id":42414},"how-to-register-your-metaads-oauth2-application",[16,42416],{},[19,42418,42419],{},[22,42420,42421],{},"March 4, 2026",[43,42423,42424,42435],{},[46,42425,42426,42427],{},"Create a Meta Developer account",[72,42428,42429],{},[46,42430,11822,42431],{},[1614,42432,42433],{"href":42433,"rel":42434},"https://developers.facebook.com/",[1618],[46,42436,34294,42437,42484,42486,42489,42548,42550,42551,42553],{},[72,42438,42439,42451,42476],{},[46,42440,11822,42441,42445,42447],{},[1614,42442,42443],{"href":42443,"rel":42444},"https://developers.facebook.com/apps/creation/",[1618],[17180,42446],{},[1603,42448],{"alt":42449,"src":42450},"03cc19ca-b1b5-43fa-b858-37a6aeb9ab77.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-0.png",[46,42452,42453,42454,42465,42467,42470,42472],{},"Enter the following details:",[72,42455,42456,42460],{},[46,42457,42458],{},[478,42459,30890],{},[46,42461,42462],{},[478,42463,42464],{},"App Contact Email",[17180,42466],{},[1603,42468],{"alt":13589,"src":42469},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-1.png",[17180,42471],{},[1603,42473],{"alt":42474,"src":42475},"Screenshot_2026-03-05_at_09.37.16.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-2.png",[46,42477,42478,42479,42481],{},"Add the following use-cases; 'Manage ads using Marketing API' and 'Measure ad performance'",[17180,42480],{},[1603,42482],{"alt":13589,"src":42483},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-3.png",[17180,42485],{},[478,42487,42488],{},"3. Configure Permissions for the Marketing API",[72,42490,42491,42499,42502,42521,42537],{},[46,42492,42493,42494,42496],{},"Enable all permissions in the 'Create & Manage Ads' and 'Measure ad performance' use-cases",[17180,42495],{},[1603,42497],{"alt":13589,"src":42498},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-4.png",[46,42500,42501],{},"or -",[46,42503,42504,42505,42515,42517],{},"After the application is created:",[72,42506,42507,42512],{},[46,42508,42509,42510,634],{},"Open the ",[478,42511,30868],{},[46,42513,42514],{},"Navigate to:\nUse Cases → Customize → Create & Manage Ads",[17180,42516],{},[1603,42518],{"alt":42519,"src":42520},"Screenshot_2026-03-05_at_09.42.12.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-5.png",[46,42522,42523,42524],{},"Enable the following permissions:",[72,42525,42526,42529,42532,42535],{},[46,42527,42528],{},"ads_management",[46,42530,42531],{},"ads_read",[46,42533,42534],{},"business_management",[46,42536,666],{},[46,42538,42539,42540],{},"Additional permissions such as:",[72,42541,42542,42545],{},[46,42543,42544],{},"pages_manage_ads",[46,42546,42547],{},"pages_read_engagement",[17180,42549],{},"This may also be enabled depending on your integration requirements.",[17180,42552],{},[1603,42554],{"alt":42555,"src":42556},"Screenshot_2026-03-05_at_09.44.57.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-6.png",[19,42558,42559],{},[478,42560,42561],{},"4. Configure Facebook Login for Business",[72,42563,42564,42573,42585],{},[46,42565,42566,42567,42569],{},"In the left sidebar, open (1, 2):\nFacebook Login for Business → Settings",[17180,42568],{},[1603,42570],{"alt":42571,"src":42572},"Screenshot_2026-03-05_at_09.49.45.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-7.png",[46,42574,42575,42576,42579,42580,42582],{},"Specify the ",[1614,42577,1640],{"href":1638,"rel":42578},[1618]," OAuth2 redirect URLs (3)",[17180,42581],{},[1603,42583],{"alt":13589,"src":42584},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-8.png",[46,42586,33709,42587,634],{},[478,42588,42589],{},"Save Changes (4)",[19,42591,42592],{},[478,42593,42594],{},"5. Configure App Domains",[72,42596,42597,42600,42639],{},[46,42598,42599],{},"Go to App Settings → Basic",[46,42601,42602,42603,42606,42607,42611,42616,42619,42624,42629,42634],{},"Add the following ",[478,42604,42605],{},"App Domains","(3):\n",[1614,42608,42610],{"href":1638,"rel":42609},[1618],"unified.to",[1614,42612,42615],{"href":42613,"rel":42614},"https://api.unified.to/",[1618],"api.unified.to",[1614,42617,31750],{"href":11523,"rel":42618},[1618],[1614,42620,42623],{"href":42621,"rel":42622},"https://api-eu.unified.to/",[1618],"api-eu.unified.to",[1614,42625,42628],{"href":42626,"rel":42627},"https://app-eu.unified.to/",[1618],"app-eu.unified.to",[1614,42630,42633],{"href":42631,"rel":42632},"https://api-au.unified.to/",[1618],"api-au.unified.to",[1614,42635,42638],{"href":42636,"rel":42637},"https://app-au.unified.to/",[1618],"app-au.unified.to",[46,42640,42641,42642,42644,42648,42650,42651,42655],{},"Scroll down and save the settings (4).",[17180,42643],{},[1603,42645],{"alt":42646,"src":42647},"Screenshot_2026-03-05_at_10.05.24.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-9.png",[17180,42649],{},"In Unified ",[1614,42652,42653],{"href":42653,"rel":42654},"https://app.unified.to/integrations/metaads",[1618],", add the application's App ID (as the client ID) and the App secret (as the client secret).  This information can be found in the App settings > Basic page.",[19,42657,42658],{},"You are now all set to authorize a MetaAds connection",{"title":107,"searchDepth":126,"depth":126,"links":42660},[],"Go to https,//developers.facebook.com/apps/creation/...",{"img":42663,"date":42664,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-icon.png","2026-03-04T16:22:00.000Z","/guides/how_to_register_your_metaads_oauth2_application",{"title":42409,"description":42661},"guides/how_to_register_your_metaads_oauth2_application","rhMAnPu0Mb-3Tp_fs6weg2hXGr8tsvLSUJhv3x6GBnI",{"id":42670,"title":42671,"body":42672,"description":42841,"extension":1576,"meta":42842,"navigation":271,"path":42845,"seo":42846,"stem":42847,"__hash__":42848},"guides/guides/how_to_request_and_write_raw_integration_data.md","How To Request & Write Raw Integration Data",{"type":9,"value":42673,"toc":42837},[42674,42677,42679,42684,42688,42695,42702,42735,42742,42746,42751,42828,42834],[12,42675,42671],{"id":42676},"how-to-request-write-raw-integration-data",[16,42678],{},[19,42680,42681],{},[22,42682,42683],{},"February 6, 2024",[35,42685,42687],{"id":42686},"reading-data","Reading data",[19,42689,42690,42691,42694],{},"While ",[1614,42692,1640],{"href":1638,"rel":42693},[1618]," abstracts all of the integration's objects into common objects, you can still request that the original object.",[19,42696,42697,42698,42701],{},"Simply include a ",[109,42699,42700],{},"fields=raw"," parameter in your request.",[102,42703,42705],{"className":9951,"code":42704,"language":9953,"meta":107,"style":107},"GET /crm/123456789/contacts?fields=raw\n",[109,42706,42707],{"__ignoreMap":107},[112,42708,42709,42711,42713,42716,42718,42721,42723,42726,42728,42730,42732],{"class":114,"line":115},[112,42710,2712],{"class":129},[112,42712,4705],{"class":229},[112,42714,42715],{"class":236},"crm",[112,42717,12874],{"class":229},[112,42719,42720],{"class":129},"123456789",[112,42722,12874],{"class":229},[112,42724,42725],{"class":236},"contacts",[112,42727,4711],{"class":229},[112,42729,31950],{"class":236},[112,42731,335],{"class":229},[112,42733,42734],{"class":236},"raw\n",[19,42736,42737,42738,42741],{},"The result will also include a field named ",[109,42739,42740],{},"raw"," that will contain the original vendor's object.  You can add more field names in there as well (comma-delimited) and only those fields will be returned.",[35,42743,42745],{"id":42744},"writing-data","Writing data",[19,42747,42697,42748,42750],{},[109,42749,42740],{}," field in the payload with the integration's specific fields.",[102,42752,42754],{"className":9951,"code":42753,"language":9953,"meta":107,"style":107},"POST /crm/123456789/contacts\n\n{\n    \"name\": \"Joe Smith\",\n    \"raw\": {\n        \"customfield1\":\"Blue\",\n        \"customfield2\":\"Bananas\"\n    }\n}\n",[109,42755,42756,42773,42777,42781,42792,42799,42810,42820,42824],{"__ignoreMap":107},[112,42757,42758,42760,42762,42764,42766,42768,42770],{"class":114,"line":115},[112,42759,31511],{"class":129},[112,42761,4705],{"class":229},[112,42763,42715],{"class":236},[112,42765,12874],{"class":229},[112,42767,42720],{"class":129},[112,42769,12874],{"class":229},[112,42771,42772],{"class":236},"contacts\n",[112,42774,42775],{"class":114,"line":126},[112,42776,272],{"emptyLinePlaceholder":271},[112,42778,42779],{"class":114,"line":135},[112,42780,2327],{"class":236},[112,42782,42783,42785,42787,42790],{"class":114,"line":147},[112,42784,26184],{"class":122},[112,42786,2335],{"class":236},[112,42788,42789],{"class":122},"\"Joe Smith\"",[112,42791,288],{"class":236},[112,42793,42794,42797],{"class":114,"line":202},[112,42795,42796],{"class":122},"    \"raw\"",[112,42798,3888],{"class":236},[112,42800,42801,42804,42806,42808],{"class":114,"line":208},[112,42802,42803],{"class":122},"        \"customfield1\"",[112,42805,171],{"class":236},[112,42807,9480],{"class":122},[112,42809,288],{"class":236},[112,42811,42812,42815,42817],{"class":114,"line":291},[112,42813,42814],{"class":122},"        \"customfield2\"",[112,42816,171],{"class":236},[112,42818,42819],{"class":122},"\"Bananas\"\n",[112,42821,42822],{"class":114,"line":299},[112,42823,3946],{"class":236},[112,42825,42826],{"class":114,"line":307},[112,42827,584],{"class":236},[19,42829,42830,42831,42833],{},"Those fields in the ",[109,42832,42740],{},"  object can also overwrite any mapped unified fields.",[1558,42835,42836],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":107,"searchDepth":126,"depth":126,"links":42838},[42839,42840],{"id":42686,"depth":135,"text":42687},{"id":42744,"depth":135,"text":42745},"While Unified.to abstracts all of the integration's objects into common objects, you can still request that the original object.",{"img":42843,"date":42844,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_request_and_write_raw_integration_data-icon.png","2024-02-06T00:00:00.000Z","/guides/how_to_request_and_write_raw_integration_data",{"title":42671,"description":42841},"guides/how_to_request_and_write_raw_integration_data","IsBRnoBNewK_0-pk_x9FRUIfYOOe7zuXf5KW-soePCc",{"id":42850,"title":42851,"body":42852,"description":43138,"extension":1576,"meta":43139,"navigation":271,"path":43142,"seo":43143,"stem":43144,"__hash__":43145},"guides/guides/how_to_retrieve_microsoft_dynamics_365_business_central_credentials.md","How to Retrieve Microsoft Dynamics 365 Business Central Credentials",{"type":9,"value":42853,"toc":43130},[42854,42857,42859,42864,42871,42873,42877,42882,42914,42916,42920,42954,42956,42960,42965,43002,43004,43008,43013,43041,43044,43046,43050,43055,43061,43098,43104,43106,43110,43113,43124,43127],[12,42855,42851],{"id":42856},"how-to-retrieve-microsoft-dynamics-365-business-central-credentials",[16,42858],{},[19,42860,42861],{},[22,42862,42863],{},"January 21, 2026",[19,42865,42866,42867,42870],{},"This guide walks you through creating an Azure App Registration, granting the correct permissions, and collecting the credentials required to integrate with ",[478,42868,42869],{},"Microsoft Dynamics 365 Business Central"," using Unified.",[16,42872],{},[67,42874,42876],{"id":42875},"_1-create-or-select-an-app-registration","1. Create or Select an App Registration",[19,42878,42879],{},[1603,42880],{"alt":13589,"src":42881},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-0.png",[43,42883,42884,42894,42898],{},[46,42885,42886,42887,42889,42890],{},"Go to the Azure Portal:",[17180,42888],{},"👉 ",[1614,42891,42892],{"href":42892,"rel":42893},"https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",[1618],[46,42895,9735,42896],{},[478,42897,35944],{},[46,42899,42900,42901],{},"Either:",[72,42902,42903,42909],{},[46,42904,42905,42906],{},"Select an existing app, ",[478,42907,42908],{},"or",[46,42910,9757,42911,42913],{},[478,42912,35948],{}," to create a new one",[16,42915],{},[67,42917,42919],{"id":42918},"_2-configure-redirect-uri","2. Configure Redirect URI",[43,42921,42922,42927,42950],{},[46,42923,42924,42925],{},"Inside your App Registration, go to ",[478,42926,26021],{},[46,42928,25422,42929,171,42932],{},[478,42930,42931],{},"Redirect URI (optional)",[72,42933,42934,42938],{},[46,42935,12267,42936],{},[478,42937,36765],{},[46,42939,42940,42941],{},"Enter the redirect URL provided by Unified",[102,42942,42944],{"className":174,"code":42943,"language":176,"meta":177,"style":107},"https://api.unified.to/oauth/code\n",[109,42945,42946],{"__ignoreMap":107},[112,42947,42948],{"class":114,"line":115},[112,42949,42943],{},[46,42951,9757,42952],{},[478,42953,31780],{},[16,42955],{},[67,42957,42959],{"id":42958},"_3-grant-business-central-api-permissions","3. Grant Business Central API Permissions",[19,42961,42962],{},[1603,42963],{"alt":13589,"src":42964},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-1.png",[43,42966,42967,42972,42976,42981,42986,42990,42993,42997],{},[46,42968,42969,42970],{},"In the App Registration, go to ",[478,42971,36051],{},[46,42973,9757,42974],{},[478,42975,36055],{},[46,42977,12267,42978],{},[478,42979,42980],{},"APIs my organization uses",[46,42982,42983,42984],{},"Search for and select ",[478,42985,42869],{},[46,42987,36884,42988],{},[478,42989,36887],{},[46,42991,42992],{},"Select the required permissions (typically default access)",[46,42994,9757,42995],{},[478,42996,36911],{},[46,42998,42999,43000],{},"If required, click ",[478,43001,36152],{},[16,43003],{},[67,43005,43007],{"id":43006},"_4-get-client-id-and-client-secret","4. Get Client ID and Client Secret",[19,43009,43010],{},[1603,43011],{"alt":13589,"src":43012},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-2.png",[43,43014,43015,43019],{},[46,43016,42969,43017],{},[478,43018,36817],{},[46,43020,43021,43022],{},"Copy the following:\n",[72,43023,43024,43029],{},[46,43025,43026,43028],{},[478,43027,30971],{}," (from the app Overview page)",[46,43030,43031,43033],{},[478,43032,30976],{},[72,43034,43035,43038],{},[46,43036,43037],{},"Create a new client secret if one does not exist",[46,43039,43040],{},"Copy it immediately (it will not be shown again)",[19,43042,43043],{},"⚠️ Store the client secret securely.",[16,43045],{},[67,43047,43049],{"id":43048},"_5-retrieve-business-central-company-name","5. Retrieve Business Central Company Name",[19,43051,43052],{},[1603,43053],{"alt":13589,"src":43054},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-3.png",[19,43056,43057,43058,634],{},"Unified also requires the ",[478,43059,43060],{},"Business Central company name",[43,43062,43063,43072,43075],{},[46,43064,43065,43066,42889,43068],{},"Go to:",[17180,43067],{},[1614,43069,43070],{"href":43070,"rel":43071},"https://businesscentral.dynamics.com/",[1618],[46,43073,43074],{},"Sign in to your Business Central account",[46,43076,43077,43078,43081,43082],{},"Locate the ",[478,43079,43080],{},"company name"," using either method:",[72,43083,43084,43092],{},[46,43085,43086,43087,1046,43090],{},"The company name shown in the ",[478,43088,43089],{},"top-left corner",[478,43091,42908],{},[46,43093,32017,43094,43097],{},[478,43095,43096],{},"building (company) icon"," in the navigation bar and copy the desired company name",[19,43099,41287,43100,43103],{},[478,43101,43102],{},"exactly"," the company name as shown.",[16,43105],{},[67,43107,43109],{"id":43108},"_6-information-you-will-need-for-unified","6. Information You Will Need for Unified",[19,43111,43112],{},"After completing the steps above, you should have:",[72,43114,43115,43118,43121],{},[46,43116,43117],{},"✅ Client ID",[46,43119,43120],{},"✅ Client Secret",[46,43122,43123],{},"✅ Business Central Company Name",[19,43125,43126],{},"These values are required to complete the Business Central connection in Unified.",[1558,43128,43129],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":43131},[43132,43133,43134,43135,43136,43137],{"id":42875,"depth":126,"text":42876},{"id":42918,"depth":126,"text":42919},{"id":42958,"depth":126,"text":42959},{"id":43006,"depth":126,"text":43007},{"id":43048,"depth":126,"text":43049},{"id":43108,"depth":126,"text":43109},"This guide walks you through creating an Azure App Registration, granting the correct permissions, and collecting the credentials required to integrate with...",{"img":43140,"date":43141,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-icon.png","2026-01-21T22:21:00.000Z","/guides/how_to_retrieve_microsoft_dynamics_365_business_central_credentials",{"title":42851,"description":43138},"guides/how_to_retrieve_microsoft_dynamics_365_business_central_credentials","W0VA0Kyvje-vfxw5Km8BwwRw6o6fraA0RC6A1iI57sE",{"id":43147,"title":43148,"body":43149,"description":43641,"extension":1576,"meta":43642,"navigation":271,"path":43645,"seo":43646,"stem":43647,"__hash__":43648},"guides/guides/how_to_set_up_a_custom_api_url.md","How to set up a custom API URL",{"type":9,"value":43150,"toc":43617},[43151,43154,43156,43161,43167,43172,43174,43185,43189,43192,43209,43213,43284,43288,43291,43307,43311,43314,43348,43352,43358,43362,43373,43381,43384,43393,43397,43426,43429,43433,43458,43462,43473,43477,43488,43490,43492,43544,43548,43553,43557,43582,43586,43595,43599,43608,43610,43615],[12,43152,43148],{"id":43153},"how-to-set-up-a-custom-api-url",[16,43155],{},[19,43157,43158],{},[22,43159,43160],{},"September 5, 2025",[19,43162,43163,43164,43166],{},"This guide will walk you through the process of setting up a custom CNAME (subdomain) for your Unified API workspace. This allows you to use your own domain instead of the default ",[109,43165,42615],{}," domain for all API calls and OAuth flows.",[10506,43168,43169],{},[19,43170,43171],{},"💡 This is mandatory when using Sensitive scopes in any of the Google integrations, doing this will allow the Google verification to pass.",[67,43173,70],{"id":69},[72,43175,43176,43179,43182],{},[46,43177,43178],{},"You must have a paid Unified plan (custom domains are not available on the free/test plan)",[46,43180,43181],{},"Access to your domain's DNS management console",[46,43183,43184],{},"Admin access to your Unified workspace",[67,43186,43188],{"id":43187},"step-1-choose-your-custom-subdomain","Step 1: Choose Your Custom Subdomain",[19,43190,43191],{},"Decide on a subdomain you want to use. For example:",[72,43193,43194,43199,43204],{},[46,43195,43196],{},[109,43197,43198],{},"api.yourcompany.com",[46,43200,43201],{},[109,43202,43203],{},"unified-api.yourcompany.com",[46,43205,43206],{},[109,43207,43208],{},"integrations.yourcompany.com",[67,43210,43212],{"id":43211},"step-2-configure-dns-cname-record","Step 2: Configure DNS CNAME Record",[43,43214,43215,43221,43227,43279],{},[46,43216,43217,43220],{},[478,43218,43219],{},"Log into your domain registrar or DNS provider"," (e.g., Cloudflare, GoDaddy, Namecheap, AWS Route 53)",[46,43222,43223,43226],{},[478,43224,43225],{},"Navigate to DNS management"," for your domain",[46,43228,43229,43232,43233],{},[478,43230,43231],{},"Add a new CNAME record"," with the following settings:\n",[72,43234,43235,43240,43250,43267,43273],{},[46,43236,43237,43239],{},[478,43238,2428],{},": CNAME",[46,43241,43242,43244,43245,9571,43247,610],{},[478,43243,31622],{},": Your chosen subdomain (e.g., ",[109,43246,23333],{},[109,43248,43249],{},"unified-api",[46,43251,43252,43255,43256,43261,43262],{},[478,43253,43254],{},"Value/Target",":\nUS: ",[1614,43257,43260],{"href":43258,"rel":43259},"https://unified-domains-us-7d67c6f04efebb36.elb.us-east-1.amazonaws.com/",[1618],"unified-domains-us-7d67c6f04efebb36.elb.us-east-1.amazonaws.com","\nEU: ",[1614,43263,43266],{"href":43264,"rel":43265},"https://unified-domains-eu-a0f8a17b303a3c06.elb.eu-central-1.amazonaws.com/",[1618],"unified-domains-eu-a0f8a17b303a3c06.elb.eu-central-1.amazonaws.com",[46,43268,43269,43272],{},[478,43270,43271],{},"TTL",": 3600 (or default)",[46,43274,43275,43278],{},[478,43276,43277],{},"Proxy status",": Disabled (if using Cloudflare)",[46,43280,43281],{},[478,43282,43283],{},"Save the CNAME record",[67,43285,43287],{"id":43286},"step-3-wait-for-dns-propagation","Step 3: Wait for DNS Propagation",[19,43289,43290],{},"DNS changes can take anywhere from a few minutes to 48 hours to propagate globally. You can check propagation using tools like:",[72,43292,43293,43300],{},[46,43294,43295],{},[1614,43296,43299],{"href":43297,"rel":43298},"https://whatsmydns.net/",[1618],"whatsmydns.net",[46,43301,43302],{},[1614,43303,43306],{"href":43304,"rel":43305},"https://dnschecker.org/",[1618],"dnschecker.org",[67,43308,43310],{"id":43309},"step-4-contact-unified-support","Step 4: Contact Unified Support",[19,43312,43313],{},"Once your CNAME is configured and propagated:",[43,43315,43316,43322,43342],{},[46,43317,43318,43321],{},[478,43319,43320],{},"Contact Unified Support"," through your preferred channel",[46,43323,43324,43327,43328],{},[478,43325,43326],{},"Provide the following information",":\n",[72,43329,43330,43333,43336],{},[46,43331,43332],{},"Your workspace name/ID",[46,43334,43335],{},"The custom subdomain you want to use",[46,43337,43338,43339],{},"Confirmation that the CNAME is configured and pointing to ",[1614,43340,43260],{"href":43258,"rel":43341},[1618],[46,43343,43344,43347],{},[478,43345,43346],{},"Support will assign the custom domain"," to your workspace",[67,43349,43351],{"id":43350},"step-5-update-oauth-application-settings","Step 5: Update OAuth Application Settings",[19,43353,43354,43357],{},[478,43355,43356],{},"CRITICAL",": After your custom domain is assigned, you must update all OAuth applications to use the new redirect URL.",[35,43359,43361],{"id":43360},"for-oauth-applications","For OAuth Applications:",[43,43363,43364,43367],{},[46,43365,43366],{},"Go to yor app Console",[46,43368,43369,43370,43372],{},"Update the ",[478,43371,42290],{}," from:",[102,43374,43375],{"className":174,"code":42943,"language":176,"meta":177,"style":107},[109,43376,43377],{"__ignoreMap":107},[112,43378,43379],{"class":114,"line":115},[112,43380,42943],{},[19,43382,43383],{},"to:",[102,43385,43387],{"className":174,"code":43386,"language":176,"meta":177,"style":107},"https://your-custom-domain.com/oauth/code\n",[109,43388,43389],{"__ignoreMap":107},[112,43390,43391],{"class":114,"line":115},[112,43392,43386],{},[67,43394,43396],{"id":43395},"step-6-verify-the-setup","Step 6: Verify the Setup",[43,43398,43399,43414,43420],{},[46,43400,43401,43404,43405],{},[478,43402,43403],{},"Test your custom domain"," by making a simple API call to:",[102,43406,43408],{"className":174,"code":43407,"language":176,"meta":177,"style":107},"https://your-custom-domain.com/swagger.json\n",[109,43409,43410],{"__ignoreMap":107},[112,43411,43412],{"class":114,"line":115},[112,43413,43407],{},[46,43415,43416,43419],{},[478,43417,43418],{},"Test OAuth flow"," by attempting to authenticate with an integration using your custom domain",[46,43421,43422,43425],{},[478,43423,43424],{},"Verify redirect URLs"," are working correctly in your OAuth applications",[67,43427,43428],{"id":35472},"Important Notes",[35,43430,43432],{"id":43431},"oauth-verification-requirements","OAuth Verification Requirements",[72,43434,43435,43441,43447],{},[46,43436,43437,43440],{},[478,43438,43439],{},"Google OAuth",": After changing the redirect URL, you may need to complete app verification since Google sees this as a new domain",[46,43442,43443,43446],{},[478,43444,43445],{},"Other providers",": May require similar verification processes",[46,43448,43449,43452,43453,610],{},[478,43450,43451],{},"App verification",": Follow the provider's specific verification process (e.g., ",[1614,43454,43457],{"href":43455,"rel":43456},"https://support.google.com/cloud/answer/13461325",[1618],"Google's verification guide",[35,43459,43461],{"id":43460},"api-usage","API Usage",[72,43463,43464,43467,43470],{},[46,43465,43466],{},"All API calls will now use your custom domain",[46,43468,43469],{},"The API functionality remains identical",[46,43471,43472],{},"Your API keys and authentication methods remain the same",[35,43474,43476],{"id":43475},"security-considerations","Security Considerations",[72,43478,43479,43482,43485],{},[46,43480,43481],{},"Ensure your DNS provider has proper security measures",[46,43483,43484],{},"Consider enabling DNSSEC if available",[46,43486,43487],{},"Monitor for any unauthorized DNS changes",[67,43489,10128],{"id":10127},[35,43491,31389],{"id":31388},[43,43493,43494,43510,43526],{},[46,43495,43496,43499],{},[478,43497,43498],{},"DNS Not Propagated",[72,43500,43501,43504,43507],{},[46,43502,43503],{},"Wait longer for propagation",[46,43505,43506],{},"Check with multiple DNS lookup tools",[46,43508,43509],{},"Verify CNAME record is correct",[46,43511,43512,43515],{},[478,43513,43514],{},"OAuth Errors After Domain Change",[72,43516,43517,43520,43523],{},[46,43518,43519],{},"Ensure redirect URLs are updated in all OAuth applications",[46,43521,43522],{},"Complete app verification if required by the provider",[46,43524,43525],{},"Check that the custom domain is properly assigned to your workspace",[46,43527,43528,43531],{},[478,43529,43530],{},"API Calls Failing",[72,43532,43533,43538,43541],{},[46,43534,43535,43536],{},"Verify the CNAME is pointing to ",[109,43537,42615],{},[46,43539,43540],{},"Check that the custom domain is assigned to your workspace",[46,43542,43543],{},"Ensure your API keys are still valid",[67,43545,43547],{"id":43546},"example-configuration","Example Configuration",[19,43549,43550,43551,171],{},"Here's a complete example for setting up ",[109,43552,43198],{},[35,43554,43556],{"id":43555},"dns-configuration","DNS Configuration:",[102,43558,43560],{"className":174,"code":43559,"language":176,"meta":177,"style":107},"Type: CNAME\nName: api\nValue: api.unified.to\nTTL: 3600\n",[109,43561,43562,43567,43572,43577],{"__ignoreMap":107},[112,43563,43564],{"class":114,"line":115},[112,43565,43566],{},"Type: CNAME\n",[112,43568,43569],{"class":114,"line":126},[112,43570,43571],{},"Name: api\n",[112,43573,43574],{"class":114,"line":135},[112,43575,43576],{},"Value: api.unified.to\n",[112,43578,43579],{"class":114,"line":147},[112,43580,43581],{},"TTL: 3600\n",[35,43583,43585],{"id":43584},"oauth-redirect-url","OAuth Redirect URL:",[102,43587,43589],{"className":174,"code":43588,"language":176,"meta":177,"style":107},"https://api.yourcompany.com/oauth/code\n",[109,43590,43591],{"__ignoreMap":107},[112,43592,43593],{"class":114,"line":115},[112,43594,43588],{},[35,43596,43598],{"id":43597},"api-endpoint","API Endpoint:",[102,43600,43602],{"className":174,"code":43601,"language":176,"meta":177,"style":107},"https://api.yourcompany.com/v1/your-endpoint\n",[109,43603,43604],{"__ignoreMap":107},[112,43605,43606],{"class":114,"line":115},[112,43607,43601],{},[16,43609],{},[19,43611,43612,43614],{},[478,43613,13464],{},": Custom domain setup requires coordination with Unified Support to ensure proper configuration and security. Please allow 1-2 business days for the setup to be completed after your CNAME is configured.",[1558,43616,43129],{},{"title":107,"searchDepth":126,"depth":126,"links":43618},[43619,43620,43621,43622,43623,43624,43627,43628,43633,43636],{"id":69,"depth":126,"text":70},{"id":43187,"depth":126,"text":43188},{"id":43211,"depth":126,"text":43212},{"id":43286,"depth":126,"text":43287},{"id":43309,"depth":126,"text":43310},{"id":43350,"depth":126,"text":43351,"children":43625},[43626],{"id":43360,"depth":135,"text":43361},{"id":43395,"depth":126,"text":43396},{"id":35472,"depth":126,"text":43428,"children":43629},[43630,43631,43632],{"id":43431,"depth":135,"text":43432},{"id":43460,"depth":135,"text":43461},{"id":43475,"depth":135,"text":43476},{"id":10127,"depth":126,"text":10128,"children":43634},[43635],{"id":31388,"depth":135,"text":31389},{"id":43546,"depth":126,"text":43547,"children":43637},[43638,43639,43640],{"id":43555,"depth":135,"text":43556},{"id":43584,"depth":135,"text":43585},{"id":43597,"depth":135,"text":43598},"This guide will walk you through the process of setting up a custom CNAME (subdomain) for your Unified API workspace. This allows you to use your own domain...",{"img":43643,"date":43644,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_a_custom_api_url-icon.webp","2025-09-05T00:00:00.000Z","/guides/how_to_set_up_a_custom_api_url",{"title":43148,"description":43641},"guides/how_to_set_up_a_custom_api_url","4fGHowdQ4a-uXSHPY_SAefsSQKL1E3A4OnkmR42GinY",{"id":43650,"title":17136,"body":43651,"description":44025,"extension":1576,"meta":44026,"navigation":271,"path":44028,"seo":44029,"stem":44030,"__hash__":44031},"guides/guides/how_to_set_up_and_configure_notion.md",{"type":9,"value":43652,"toc":44019},[43653,43656,43658,43662,43665,43669,43672,43686,43689,43697,43705,43709,43712,43771,43787,43791,43794,43818,43825,43885,43888,43897,43899,43902,44014,44017],[12,43654,17136],{"id":43655},"how-to-set-up-and-configure-notion",[16,43657],{},[19,43659,43660],{},[22,43661,34259],{},[19,43663,43664],{},"This guide describes how to register a public Notion application (a.k.a. ‘integration') and configure it so that you can use the Unified API to query pages and databases.",[67,43666,43668],{"id":43667},"understanding-notion-integrations-internal-vs-public","Understanding Notion integrations: Internal vs Public",[19,43670,43671],{},"Before setting up your Notion integration, it's important to understand the two types of integrations Notion offers:",[43,43673,43674,43680],{},[46,43675,43676,43679],{},[478,43677,43678],{},"Internal Integrations",": These are confined to a single workspace and are only accessible by members of that workspace. They're ideal for custom workspace enhancements.",[46,43681,43682,43685],{},[478,43683,43684],{},"Public Integrations",": These are designed for a wider audience and can be used across any Notion workspace. They follow the OAuth 2.0 protocol for workspace access.",[19,43687,43688],{},"The main difference in terms of accessing user data is:",[72,43690,43691,43694],{},[46,43692,43693],{},"For Internal Integrations, workspace members explicitly grant access to their pages or databases via Notion's UI.",[46,43695,43696],{},"For Public Integrations, users authorize access to their pages during the OAuth flow, or by sharing pages directly with the integration.",[19,43698,43699,43700,634],{},"For more information on the differences, refer to the ",[1614,43701,43704],{"href":43702,"rel":43703},"https://developers.notion.com/docs/getting-started",[1618],"Notion API Overview",[67,43706,43708],{"id":43707},"setting-up-your-notion-integration","Setting up your Notion integration",[19,43710,43711],{},"The following steps outline how to register a public Notion integration:",[43,43713,43714,43720,43723,43743,43747,43756,43763],{},[46,43715,11822,43716],{},[1614,43717,43718],{"href":43718,"rel":43719},"https://www.notion.so/my-integrations",[1618],[46,43721,43722],{},"Click on your integration (or create a new one)",[46,43724,43725,43726],{},"Follow the steps to register a new Notion integration.\n",[43,43727,43728,43735],{},[46,43729,25422,43730,36750,43732,634],{},[478,43731,2428],{},[478,43733,43734],{},"Public",[46,43736,25422,43737,43740,43741],{},[478,43738,43739],{},"Redirect URIs",", enter ",[109,43742,34368],{},[46,43744,9757,43745,634],{},[478,43746,31780],{},[46,43748,43749,43750,11338,43753],{},"Go to the configuration settings of your newly created integration and make a note of the ",[478,43751,43752],{},"OAuth Client ID",[478,43754,43755],{},"OAuth Client Secret.",[46,43757,43758,43759,43762],{},"Still under the configuration settings, make sure to select the permissions you need for your app under ",[478,43760,43761],{},"Capabilities"," e.g. read or update content.",[46,43764,43765,43766,43770],{},"Enter your OAuth credentials on ",[1614,43767,43768],{"href":43768,"rel":43769},"https://app.unified.to/integrations/notion",[1618]," to activate the Notion integration.",[19,43772,43773,43775,43776,25599,43779,43782,43783,634],{},[478,43774,12467],{}," If you wish to create an Internal integration, most of the steps above can be skipped, and you will need to enter your ",[109,43777,43778],{},"Internal integration token",[1614,43780,31750],{"href":11523,"rel":43781},[1618]," instead. Instructions on how to find your internal token can be found ",[1614,43784,17258],{"href":43785,"rel":43786},"https://www.notion.so/help/create-integrations-with-the-notion-api",[1618],[67,43788,43790],{"id":43789},"querying-databases-in-notion","Querying databases in Notion",[19,43792,43793],{},"To query databases in Notion, you'll need to use our Unified KMS endpoint:",[43,43795,43796,43802],{},[46,43797,43798,43799,43801],{},"First, make sure you have a ",[109,43800,2886],{}," for your Notion integration.",[46,43803,43804,43805,43808,43809],{},"Since database entries in Notion are technically pages, we'll use the ",[478,43806,43807],{},"List all pages"," endpoint:",[102,43810,43812],{"className":174,"code":43811,"language":176,"meta":177,"style":107},"GET /kms/{connection_id}/page\n",[109,43813,43814],{"__ignoreMap":107},[112,43815,43816],{"class":114,"line":115},[112,43817,43811],{},[19,43819,43820,43821],{},"API reference: ",[1614,43822,43807],{"href":43823,"rel":43824},"https://docs.unified.to/kms/page/List_all_pages",[1618],[43,43826,43827,43843],{},[46,43828,43829,43830,43833,43834],{},"When querying pages in a database, you need to pass the database ID as the ",[109,43831,43832],{},"space_id"," parameter. For example:",[102,43835,43837],{"className":174,"code":43836,"language":176,"meta":177,"style":107},"GET /kms/{connection_id}/page?space_id={database_id}\n",[109,43838,43839],{"__ignoreMap":107},[112,43840,43841],{"class":114,"line":115},[112,43842,43836],{},[46,43844,43845,43846],{},"You can use additional parameters to filter and sort your results:",[72,43847,43848,43853,43858,43864,43869,43875,43880],{},[46,43849,43850,43852],{},[109,43851,2680],{},": Number of results to return (default: 30)",[46,43854,43855,43857],{},[109,43856,2693],{},": Number of results to skip (default: 0)",[46,43859,43860,43863],{},[109,43861,43862],{},"updated_gte",": Return only results updated on or after this date",[46,43865,43866,43868],{},[109,43867,24991],{},": Sort by 'name', 'updated_at', or 'created_at'",[46,43870,43871,43874],{},[109,43872,43873],{},"order",": Sort order ('asc' or 'desc')",[46,43876,43877,43879],{},[109,43878,1166],{},": Search query string",[46,43881,43882,43884],{},[109,43883,31950],{},": Comma-separated list of fields to return",[19,43886,43887],{},"For example, to get the first 50 pages in a database, sorted by name in ascending order:",[102,43889,43891],{"className":174,"code":43890,"language":176,"meta":177,"style":107},"GET /kms/{connection_id}/page?space_id={database_id}&limit=50&sort=name&order=asc\n",[109,43892,43893],{"__ignoreMap":107},[112,43894,43895],{"class":114,"line":115},[112,43896,43890],{},[67,43898,31764],{"id":31481},[19,43900,43901],{},"Notion doesn't offer programmatic creation of webhooks, so you need to first create webhooks for your application.  Then, you can use our CreateWebhook API endpoint to select what data and connection you want to receive.",[43,43903,43904,43911,43914,43927,43954,43984,43994],{},[46,43905,43906,43907],{},"Go you your Notion's integrations page at ",[1614,43908,43909],{"href":43909,"rel":43910},"https://www.notion.so/profile/integrations",[1618],[46,43912,43913],{},"Either create a new integration or select an existing one.",[46,43915,9926,43916,43918,43919,634,43922,43924],{},[478,43917,31764],{}," tab and click ",[478,43920,43921],{},"+ Create a subscription",[17180,43923],{},[1603,43925],{"alt":13589,"src":43926},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-0.png",[46,43928,43929,43930,43933,43934,43948,43950],{},"Enter your public ",[478,43931,43932],{},"Webhook URL"," — this is the public endpoint where you want Notion to send events. It must be a secure (SSL) and publicly available endpoint. Endpoints in localhost are not\nreachable.",[43,43935,43936,43942],{},[46,43937,43938,43939],{},"US: ",[109,43940,43941],{},"https://api.unified.to/webhook/workspace/notion?workspace_id=$WORKSPACE_ID",[46,43943,43944,43945],{},"EU: ",[109,43946,43947],{},"https://api-eu.unified.to/webhook/workspace/notion?workspace_id=$WORKSPACE_ID",[17180,43949],{},[1603,43951],{"alt":43952,"src":43953},"1ef497d7b9b3622de379e6907cd722167766413693ac9f1885b59eb028b4e7dd-webhooks-2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-1.png",[46,43955,43956,43957,11338,43959,43962,43963,43965,43966,11338,43968,43971,43972,43975,43976,43979,43980,43983],{},"Select the events that you are interested in receiving from all of your customers.  Created and Deleted events are associated with our ",[109,43958,31811],{},[109,43960,43961],{},"deleted"," events, while all other events are associated with our ",[109,43964,31807],{}," event.  Both Notion's ",[109,43967,13311],{},[109,43969,43970],{},"Database"," are mapped to Unified's ",[109,43973,43974],{},"KMSPage",", while ",[109,43977,43978],{},"Comments"," are mapped to ",[109,43981,43982],{},"KMSComment",". You can modify these later if needed.",[46,43985,9757,43986,634,43989,43991],{},[478,43987,43988],{},"Create subscription",[17180,43990],{},[1603,43992],{"alt":13589,"src":43993},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-2.png",[46,43995,43996,43997,44001,44002,44005,44006,44009,44011],{},"After you create the notion webhook, notion will send us a verification token. You can find that verification token in ",[1614,43998,43999],{"href":43999,"rel":44000},"https://app.unified.to/settings/api",[1618],". Paste the ",[109,44003,44004],{},"verification_token"," value into the Verify Subscription form in Notion, and click ",[478,44007,44008],{},"Verify subscription.",[17180,44010],{},[1603,44012],{"alt":13589,"src":44013},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-3.png",[19,44015,44016],{},"Once completed, you can create webhooks in Unified.to that will receive these Notion events in real-time.",[1558,44018,43129],{},{"title":107,"searchDepth":126,"depth":126,"links":44020},[44021,44022,44023,44024],{"id":43667,"depth":126,"text":43668},{"id":43707,"depth":126,"text":43708},{"id":43789,"depth":126,"text":43790},{"id":31481,"depth":126,"text":31764},"This guide describes how to register a public Notion application (a.k.a. ‘integration') and configure it so that you can use the Unified API to query pages and...",{"img":44027,"date":34537,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-icon.png","/guides/how_to_set_up_and_configure_notion",{"title":17136,"description":44025},"guides/how_to_set_up_and_configure_notion","a8FaBzZnOYtX9PuQwQZ03mMzSHavJsFkvEX_gJGl2kc",{"id":44033,"title":44034,"body":44035,"description":44522,"extension":1576,"meta":44523,"navigation":271,"path":44526,"seo":44527,"stem":44528,"__hash__":44529},"guides/guides/how_to_set_up_linkedin_webhooks_with_unified.md","How to Set Up LinkedIn Webhooks with Unified",{"type":9,"value":44036,"toc":44513},[44037,44040,44042,44047,44050,44056,44064,44075,44081,44084,44089,44128,44133,44136,44165,44171,44176,44179,44209,44214,44217,44237,44240,44246,44256,44261,44264,44267,44275,44278,44283,44314,44317,44323,44334,44337,44340,44343,44350,44353,44359,44365,44419,44436,44442,44445,44450,44462,44466,44480,44489,44498,44501,44507],[12,44038,44034],{"id":44039},"how-to-set-up-linkedin-webhooks-with-unified",[16,44041],{},[19,44043,44044],{},[22,44045,44046],{},"February 14, 2026",[19,44048,44049],{},"LinkedIn's Organization Social Action Notifications let you receive real-time updates when people interact with your company page -- likes, comments, shares, and mentions. With Unified, you can subscribe to these events through the same webhook API you use for every other integration, so there's no need to learn LinkedIn's proprietary webhook protocol.",[67,44051,44053],{"id":44052},"what-youll-need",[478,44054,44055],{},"What You'll Need",[19,44057,44058,44059,44063],{},"Before starting, review the ",[1614,44060,14265],{"href":44061,"rel":44062},"https://docs.unified.to/guides/getting_started_with_unified",[1618]," article if you haven't already. You'll also need:",[72,44065,44066,44069,44072],{},[46,44067,44068],{},"A LinkedIn developer app (see setup instructions below)",[46,44070,44071],{},"A LinkedIn connection created through Unified's embedded auth flow",[46,44073,44074],{},"A publicly accessible URL to receive webhook events",[67,44076,44078],{"id":44077},"setting-up-your-linkedin-developer-app",[478,44079,44080],{},"Setting Up Your LinkedIn Developer App",[19,44082,44083],{},"Before you can receive webhook events, you need a LinkedIn app configured with the right products and permissions.",[19,44085,44086],{},[478,44087,44088],{},"Creating the App",[43,44090,44091,44101,44123],{},[46,44092,33699,44093,44098,44099],{},[1614,44094,44097],{"href":44095,"rel":44096},"https://www.linkedin.com/developers/apps",[1618],"linkedin.com/developers/apps","and click ",[478,44100,30880],{},[46,44102,44103,44104],{},"Fill in the required fields:\n",[72,44105,44106,44111,44117],{},[46,44107,44108,44110],{},[478,44109,31205],{},": Your application's name",[46,44112,44113,44116],{},[478,44114,44115],{},"LinkedIn Page",": Select the LinkedIn company page you want to monitor (you must be an admin of the page)",[46,44118,44119,44122],{},[478,44120,44121],{},"App logo",": Upload a logo for your app",[46,44124,44125,44126],{},"Accept the legal terms and click ",[478,44127,35154],{},[19,44129,44130],{},[478,44131,44132],{},"Requesting API Products",[19,44134,44135],{},"LinkedIn gates webhook access behind specific API products. From your app's settings page:",[43,44137,44138,44143,44154],{},[46,44139,44140,44141,34973],{},"Navigate to the ",[478,44142,22801],{},[46,44144,44145,44146,44149,44150,44153],{},"Request access to ",[478,44147,44148],{},"Community Management API"," -- this grants the ",[109,44151,44152],{},"r_organization_social"," scope needed for social action notifications",[46,44155,44156,44157,44160,44161,44164],{},"If you also want to send messages, request ",[478,44158,44159],{},"LinkedIn Marketing API Partner Program"," for the ",[109,44162,44163],{},"w_messages"," scope",[19,44166,44167,44168,44170],{},"Product approvals can take a few business days. You can check the status on the ",[478,44169,22801],{}," tab.",[19,44172,44173],{},[478,44174,44175],{},"Configuring OAuth Scopes",[19,44177,44178],{},"Once your products are approved:",[43,44180,44181,44186,44195,44203],{},[46,44182,41752,44183,44185],{},[478,44184,35114],{}," tab in your app settings",[46,44187,36311,44188,44191,44192,44194],{},[478,44189,44190],{},"OAuth 2.0 scopes",", verify that ",[109,44193,44152],{}," is listed",[46,44196,44197,44198,33518,44200,44202],{},"Copy your ",[478,44199,30971],{},[478,44201,30976],{}," -- you'll need these when creating a connection in Unified",[46,44204,36311,44205,44208],{},[478,44206,44207],{},"Authorized redirect URLs",", add your Unified OAuth callback URL",[19,44210,44211],{},[478,44212,44213],{},"Verifying Your Company Page",[19,44215,44216],{},"LinkedIn requires that your developer app is associated with a verified company page:",[43,44218,44219,44224,44230],{},[46,44220,41752,44221,44223],{},[478,44222,25570],{}," tab in your app",[46,44225,36311,44226,44229],{},[478,44227,44228],{},"App Settings",", confirm the correct LinkedIn Page is linked",[46,44231,44232,44233,44236],{},"A page admin must verify the app -- click ",[478,44234,44235],{},"Generate URL"," next to the verification prompt and share it with a page admin if needed",[19,44238,44239],{},"Once the page is verified and the products are approved, your app is ready to receive social action notifications.",[67,44241,44243],{"id":44242},"creating-a-webhook-for-linkedin-events",[478,44244,44245],{},"Creating a Webhook for LinkedIn Events",[19,44247,44248,44249,44252,44253,44255],{},"You can create a webhook subscription through the API or the Unified dashboard. The webhook will listen for ",[109,44250,44251],{},"messaging_event"," objects with the ",[109,44254,31811],{}," event, which is how LinkedIn's social action notifications are surfaced.",[19,44257,44258],{},[478,44259,44260],{},"Via the API",[19,44262,44263],{},"`import { UnifiedTo } from '@unified-api/typescript-sdk';",[19,44265,44266],{},"const sdk = new UnifiedTo({\nsecurity: {\njwt: process.env.UNIFIED_API_KEY!,\n},\n});",[19,44268,44269,44270,44274],{},"const webhook = await sdk.unified.createUnifiedWebhook({\nwebhook: {\nhookUrl: '",[1614,44271,44272],{"href":44272,"rel":44273},"https://your-app.com/webhooks/linkedin",[1618],"',\nconnectionId: process.env.LINKEDIN_CONNECTION_ID!,\nobjectType: 'messaging_event',\nevent: 'created',\n},\n});",[19,44276,44277],{},"console.log('Webhook created:', webhook.webhook?.id);`",[19,44279,44280],{},[478,44281,44282],{},"Via the Dashboard",[43,44284,44285,44292,44300,44303,44311],{},[46,44286,44287,44288,44291],{},"Open ",[1614,44289,31750],{"href":11523,"rel":44290},[1618]," and navigate to your workspace",[46,44293,33699,44294,44296,44297],{},[478,44295,31764],{}," and click ",[478,44298,44299],{},"Create Webhook",[46,44301,44302],{},"Select your LinkedIn connection",[46,44304,44305,44306,44308,44309],{},"Set the object type to ",[109,44307,44251],{}," and the event to ",[109,44310,31811],{},[46,44312,44313],{},"Enter your webhook URL and save",[19,44315,44316],{},"Once the webhook is active, Unified registers your endpoint with LinkedIn's event subscription API using the organization URN from your connection.",[67,44318,44320],{"id":44319},"receiving-events",[478,44321,44322],{},"Receiving Events",[19,44324,44325,44326,44329,44330,44333],{},"When someone interacts with your LinkedIn company page, Unified converts the raw LinkedIn notification into a standard ",[109,44327,44328],{},"MessagingEvent"," object and POSTs it to your ",[109,44331,44332],{},"hook_url",". Here's what that looks like:",[19,44335,44336],{},"`import express from 'express';",[19,44338,44339],{},"const app = express();\napp.use(express.json());",[19,44341,44342],{},"app.post('/webhooks/linkedin', (req, res) => {\nconst event = req.body;",[102,44344,44348],{"className":44345,"code":44347,"language":177},[44346],"language-text","switch (event.type) {\n    case 'MESSAGE_RECEIVED':\n        // Someone commented on a company post, shared it, or edited/deleted a comment\n        console.log('Comment or share from:', event.user?.id);\n        console.log('On organization:', event.channel?.id);\n        break;\n\n    case 'REACTION_ADDED':\n        // Someone liked a company post\n        console.log('Like from:', event.user?.id);\n        break;\n\n    case 'APP_MENTION':\n        // Your company was mentioned in a share\n        console.log('Mentioned by:', event.user?.id);\n        break;\n}\n\nres.sendStatus(200);\n",[109,44349,44347],{"__ignoreMap":107},[19,44351,44352],{},"});`",[67,44354,44356],{"id":44355},"event-type-mapping",[478,44357,44358],{},"Event Type Mapping",[19,44360,44361,44362,44364],{},"LinkedIn's social action types are mapped to Unified's standard ",[109,44363,44328],{},"types:",[72,44366,44367,44380,44390,44398,44407],{},[46,44368,44369,33518,44372,44375,44376,44379],{},[478,44370,44371],{},"COMMENT",[478,44373,44374],{},"ADMIN_COMMENT","become ",[109,44377,44378],{},"MESSAGE_RECEIVED"," -- a new comment was posted on your organization's content",[46,44381,44382,44385,44386,44389],{},[478,44383,44384],{},"LIKE"," becomes ",[109,44387,44388],{},"REACTION_ADDED"," -- someone liked your organization's post",[46,44391,44392,44385,44395,44397],{},[478,44393,44394],{},"SHARE",[109,44396,44378],{}," -- someone shared your organization's content",[46,44399,44400,44385,44403,44406],{},[478,44401,44402],{},"SHARE_MENTION",[109,44404,44405],{},"APP_MENTION"," -- your organization was mentioned in a share",[46,44408,44409,33518,44412,44415,44416,44418],{},[478,44410,44411],{},"COMMENT_EDIT",[478,44413,44414],{},"COMMENT_DELETE"," become ",[109,44417,44378],{}," -- an existing comment was modified or removed",[19,44420,44421,44422,44425,44426,44429,44430,44432,44433,44435],{},"Each event includes the ",[109,44423,44424],{},"channel"," field set to your organization's ID, the ",[109,44427,44428],{},"user","field with the actor's person ID, and a ",[109,44431,32079],{}," timestamp. The original LinkedIn payload is always available in the ",[109,44434,42740],{}," field if you need additional detail.",[67,44437,44439],{"id":44438},"sending-messages-alongside-webhooks",[478,44440,44441],{},"Sending Messages Alongside Webhooks",[19,44443,44444],{},"While webhooks cover inbound events, you can also send outbound messages through LinkedIn's Messages API using the same connection. This is useful for responding to engagement by reaching out to the people interacting with your content.",[19,44446,44447],{},[109,44448,44449],{},"const message = await sdk.messaging.createMessagingMessage({     messagingMessage: {         message: 'Thanks for engaging with our content!',         destinationMembers: [             { userId: 'urn:li:person:ABC123' },         ],     },     connectionId: process.env.LINKEDIN_CONNECTION_ID!, });",[19,44451,44452,44453,44455,44456,44459,44460,772],{},"Note that LinkedIn's Messages API requires partner-level access with the ",[109,44454,44163],{}," scope. Message creation supports new conversations (via ",[109,44457,44458],{},"destinationMembers",") or replies to existing threads (via ",[109,44461,19167],{},[67,44463,44464],{"id":10127},[478,44465,10128],{},[19,44467,44468,44471,44472,44474,44475,44479],{},[478,44469,44470],{},"Webhook not receiving events?"," LinkedIn requires the ",[109,44473,44152],{},"OAuth scope, which is granted through the Community Management API product. Verify your app has this product approved on the ",[1614,44476,44478],{"href":44095,"rel":44477},[1618],"LinkedIn Developer Portal",", and that your connection has the scope by checking the connection details in the Unified dashboard.",[19,44481,44482,44485,44486,44488],{},[478,44483,44484],{},"Events arriving for the wrong organization?"," The webhook subscription is tied to the ",[109,44487,1923],{}," stored in your connection metadata, which is set during the initial OAuth flow. If you manage multiple LinkedIn organizations, create separate connections for each one.",[19,44490,44491,44494,44495,44497],{},[478,44492,44493],{},"LinkedIn Page not verified?"," Your developer app must be associated with a verified company page. Go to your app's ",[478,44496,25570],{}," tab on the LinkedIn Developer Portal and complete the page verification process. A page admin must approve the association.",[19,44499,44500],{},"With just a few lines of code, you're now receiving real-time LinkedIn engagement data through the same webhook infrastructure you use for Slack, Discord, and every other messaging integration on Unified. No custom protocol handling required.",[19,44502,44503],{},[1614,44504,44506],{"href":12214,"rel":44505},[1618],"→ Start your 30-day free trial",[19,44508,44509],{},[1614,44510,44512],{"href":33418,"rel":44511},[1618],"→ Book a demo",{"title":107,"searchDepth":126,"depth":126,"links":44514},[44515,44516,44517,44518,44519,44520,44521],{"id":44052,"depth":126,"text":44055},{"id":44077,"depth":126,"text":44080},{"id":44242,"depth":126,"text":44245},{"id":44319,"depth":126,"text":44322},{"id":44355,"depth":126,"text":44358},{"id":44438,"depth":126,"text":44441},{"id":10127,"depth":126,"text":10128},"LinkedIn's Organization Social Action Notifications let you receive real-time updates when people interact with your company page -- likes, comments, shares,...",{"img":44524,"date":44525,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_linkedin_webhooks_with_unified-icon.png","2026-02-14T23:04:00.000Z","/guides/how_to_set_up_linkedin_webhooks_with_unified",{"title":44034,"description":44522},"guides/how_to_set_up_linkedin_webhooks_with_unified","J2dux4jtvQ0fAgYeu3UZjvSIM_bAisdXwP2MwtFt0QI",{"id":44531,"title":44532,"body":44533,"description":44735,"extension":1576,"meta":44736,"navigation":271,"path":44739,"seo":44740,"stem":44741,"__hash__":44742},"guides/guides/how_to_set_up_slack_webhooks_using_event_subscriptions.md","How to set up Slack webhooks using event subscriptions",{"type":9,"value":44534,"toc":44729},[44535,44538,44540,44545,44548,44550,44552,44576,44580,44651,44655,44658,44710,44713,44715,44717],[12,44536,44532],{"id":44537},"how-to-set-up-slack-webhooks-using-event-subscriptions",[16,44539],{},[19,44541,44542],{},[22,44543,44544],{},"November 14, 2024",[19,44546,44547],{},"This guide explains how to configure your Slack app's event subscriptions to work with Unified.to webhooks. This is a required step before you can create webhooks that listen for Slack events. Once configured, your webhooks will receive real-time notifications when specific events occur in your Slack workspace, such as when users send messages.",[67,44549,13634],{"id":13633},[19,44551,36686],{},[72,44553,44554,44557,44560,44566,44573],{},[46,44555,44556],{},"A Slack app created in your workspace",[46,44558,44559],{},"Access to your Slack app's configuration settings",[46,44561,9817,44562,44565],{},[1614,44563,1640],{"href":1638,"rel":44564},[1618]," workspace ID",[46,44567,44568,44569],{},"An understanding of ",[1614,44570,44572],{"href":31479,"rel":44571},[1618],"how webhooks work in Unified.to",[46,44574,44575],{},"Create a webhook in your",[67,44577,44579],{"id":44578},"enable-event-subscriptions-in-slack","Enable event subscriptions in Slack",[43,44581,44582,44588,44591,44600,44610,44637,44646],{},[46,44583,44584,44585],{},"Go to the Slack API dashboard at ",[1614,44586,40940],{"href":40940,"rel":44587},[1618],[46,44589,44590],{},"Select your app from the list of available apps",[46,44592,44593,44594,34359,44597],{},"In the left sidebar, under ",[478,44595,44596],{},"Features",[478,44598,44599],{},"Event Subscriptions",[46,44601,44602,44603,44606,44607],{},"Toggle the ",[478,44604,44605],{},"Enable Events"," switch to ",[478,44608,44609],{},"On",[46,44611,34291,44612,44615,44616,44619,44620,44622,44623],{},[478,44613,44614],{},"Request URL"," field, enter (depending on your data center —- replace ID with your workspace ID —- replace ",[109,44617,44618],{},"slack"," with ",[109,44621,41175],{}," if using that integration):",[43,44624,44625,44631],{},[46,44626,44627,44628],{},"(US data center) ",[109,44629,44630],{},"https://api.unified.to/webhook/workspace/slack?workspace_id={ID}",[46,44632,44633,44634],{},"(EU data center) ",[109,44635,44636],{},"https://api-eu.unified.to/webhook/workspace/slack?workspace_id={ID}",[46,44638,44639,44640,44642],{},"Wait for Slack to verify the URL. You should see a green checkmark indicating successful verification.",[17180,44641],{},[1603,44643],{"alt":44644,"src":44645},"Screenshot_2024-11-14_at_5.10.40_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_slack_webhooks_using_event_subscriptions-0.png",[46,44647,9757,44648,44650],{},[478,44649,34470],{}," at the bottom of the page",[67,44652,44654],{"id":44653},"subscribe-to-events-from-slack","Subscribe to events from Slack",[19,44656,44657],{},"After you've enabled events and verified the request URL works, you need to subscribe to the events that you are interested in.",[43,44659,44660,44667,44706],{},[46,44661,44662,44663,44666],{},"The minimum event you should subscribe to is",[109,44664,44665],{},"message.groups"," (under user)",[46,44668,44669,44670,171,44673],{},"The other events you can subscribe to are the ones that fall under the following scopes under ",[478,44671,44672],{},"Subscribe to events on behalf of users",[43,44674,44675,44680,44685,44690],{},[46,44676,44677],{},[109,44678,44679],{},"channels:history",[46,44681,44682],{},[109,44683,44684],{},"groups:history",[46,44686,44687],{},[109,44688,44689],{},"im:history",[46,44691,44692,44695,44697,44701,44703],{},[109,44693,44694],{},"mpim:history",[17180,44696],{},[1603,44698],{"alt":44699,"src":44700},"Screenshot_2025-01-09_at_4.25.30_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_slack_webhooks_using_event_subscriptions-1.png",[17180,44702],{},[22,44704,44705],{},"Example of Slack events that you can subscribe to for webhook events",[46,44707,9757,44708,44650],{},[478,44709,34470],{},[19,44711,44712],{},"Once completed, you can create webhooks in Unified.to that will receive these Slack events in real-time.",[19,44714,20468],{},[67,44716,25945],{"id":25944},[72,44718,44719,44724],{},[46,44720,44721],{},[1614,44722,31448],{"href":39839,"rel":44723},[1618],[46,44725,44726],{},[1614,44727,31471],{"href":31469,"rel":44728},[1618],{"title":107,"searchDepth":126,"depth":126,"links":44730},[44731,44732,44733,44734],{"id":13633,"depth":126,"text":13634},{"id":44578,"depth":126,"text":44579},{"id":44653,"depth":126,"text":44654},{"id":25944,"depth":126,"text":25945},"This guide explains how to configure your Slack app's event subscriptions to work with Unified.to webhooks. This is a required step before you can create...",{"img":44737,"date":44738,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_slack_webhooks_using_event_subscriptions-icon.png","2024-11-14T00:00:00.000Z","/guides/how_to_set_up_slack_webhooks_using_event_subscriptions",{"title":44532,"description":44735},"guides/how_to_set_up_slack_webhooks_using_event_subscriptions","f-yzy9G9NKjATnPWqcBIMPv9b8oxc-AK-w7PERv1ArM",{"id":44744,"title":25967,"body":44745,"description":45472,"extension":1576,"meta":45473,"navigation":271,"path":45476,"seo":45477,"stem":45478,"__hash__":45479},"guides/guides/how_to_set_up_your_scopes_in_hubspot.md",{"type":9,"value":44746,"toc":45458},[44747,44750,44752,44757,44760,44762,44765,44786,44790,44803,44808,44812,45110,45114,45122,45126,45131,45135,45140,45144,45152,45197,45202,45206,45214,45219,45224,45229,45236,45243,45254,45258,45261,45294,45301,45333,45339,45343,45346,45354,45359,45363,45369,45379,45382,45387,45389,45396,45399,45435,45437,45455],[12,44748,25967],{"id":44749},"how-to-set-up-your-scopes-in-hubspot",[16,44751],{},[19,44753,44754],{},[22,44755,44756],{},"June 11, 2024",[19,44758,44759],{},"This guide explains how to correctly configure the advanced scopes settings in your HubSpot developer app for seamless integration with Unified.to. We'll cover setting up both required and optional scopes, and address some common issues you might encounter.",[67,44761,13634],{"id":13633},[19,44763,44764],{},"This guide assumes you have a basic understanding of:",[72,44766,44767,44772,44779],{},[46,44768,44769],{},[1614,44770,25481],{"href":9872,"rel":44771},[1618],[46,44773,44774],{},[1614,44775,44778],{"href":44776,"rel":44777},"https://docs.unified.to/guides/how_to_create_connection_with_hubspot",[1618],"How to create a connection (Project) ",[46,44780,44781],{},[1614,44782,44785],{"href":44783,"rel":44784},"https://docs.unified.to/guides/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps",[1618],"How to get your HubSpot developer key and OAuth 2 credentials (Legacy App)",[67,44787,44789],{"id":44788},"set-up-required-scopes-in-hubspot-project","Set up required scopes in HubSpot (Project)",[43,44791,44792,44798,44801],{},[46,44793,11822,44794,44797],{},[1614,44795,32266],{"href":32266,"rel":44796},[1618],", Sign in.",[46,44799,44800],{},"Development →  Project → select your project",[46,44802,32421],{},[19,44804,44805],{},[1603,44806],{"alt":13589,"src":44807},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-0.png",[43,44809,44810],{},[46,44811,32431],{},[102,44813,44814],{"className":9951,"code":32434,"language":9953,"meta":107,"style":107},[109,44815,44816,44820,44830,44840,44846,44856,44866,44876,44882,44892,44898,44904,44908,44914,44920,44926,44932,44938,44944,44950,44956,44962,44968,44974,44980,44986,44992,44998,45002,45006,45012,45018,45022,45028,45038,45044,45050,45054,45060,45070,45080,45090,45098,45102,45106],{"__ignoreMap":107},[112,44817,44818],{"class":114,"line":115},[112,44819,2327],{"class":236},[112,44821,44822,44824,44826,44828],{"class":114,"line":126},[112,44823,25734],{"class":122},[112,44825,2335],{"class":236},[112,44827,32449],{"class":122},[112,44829,288],{"class":236},[112,44831,44832,44834,44836,44838],{"class":114,"line":135},[112,44833,8956],{"class":122},[112,44835,2335],{"class":236},[112,44837,32460],{"class":122},[112,44839,288],{"class":236},[112,44841,44842,44844],{"class":114,"line":147},[112,44843,25756],{"class":122},[112,44845,3888],{"class":236},[112,44847,44848,44850,44852,44854],{"class":114,"line":202},[112,44849,32473],{"class":122},[112,44851,2335],{"class":236},[112,44853,32478],{"class":122},[112,44855,288],{"class":236},[112,44857,44858,44860,44862,44864],{"class":114,"line":208},[112,44859,26184],{"class":122},[112,44861,2335],{"class":236},[112,44863,32489],{"class":122},[112,44865,288],{"class":236},[112,44867,44868,44870,44872,44874],{"class":114,"line":291},[112,44869,32496],{"class":122},[112,44871,2335],{"class":236},[112,44873,32501],{"class":122},[112,44875,288],{"class":236},[112,44877,44878,44880],{"class":114,"line":299},[112,44879,32508],{"class":122},[112,44881,3888],{"class":236},[112,44883,44884,44886,44888,44890],{"class":114,"line":307},[112,44885,32515],{"class":122},[112,44887,2335],{"class":236},[112,44889,32520],{"class":122},[112,44891,288],{"class":236},[112,44893,44894,44896],{"class":114,"line":315},[112,44895,32527],{"class":122},[112,44897,2372],{"class":236},[112,44899,44900,44902],{"class":114,"line":323},[112,44901,32534],{"class":122},[112,44903,288],{"class":236},[112,44905,44906],{"class":114,"line":329},[112,44907,4450],{"class":236},[112,44909,44910,44912],{"class":114,"line":341},[112,44911,32545],{"class":122},[112,44913,2372],{"class":236},[112,44915,44916,44918],{"class":114,"line":346},[112,44917,32552],{"class":122},[112,44919,288],{"class":236},[112,44921,44922,44924],{"class":114,"line":366},[112,44923,32559],{"class":122},[112,44925,288],{"class":236},[112,44927,44928,44930],{"class":114,"line":381},[112,44929,32566],{"class":122},[112,44931,288],{"class":236},[112,44933,44934,44936],{"class":114,"line":387},[112,44935,32573],{"class":122},[112,44937,288],{"class":236},[112,44939,44940,44942],{"class":114,"line":392},[112,44941,32580],{"class":122},[112,44943,288],{"class":236},[112,44945,44946,44948],{"class":114,"line":409},[112,44947,32587],{"class":122},[112,44949,288],{"class":236},[112,44951,44952,44954],{"class":114,"line":422},[112,44953,32594],{"class":122},[112,44955,288],{"class":236},[112,44957,44958,44960],{"class":114,"line":435},[112,44959,32587],{"class":122},[112,44961,288],{"class":236},[112,44963,44964,44966],{"class":114,"line":440},[112,44965,32607],{"class":122},[112,44967,288],{"class":236},[112,44969,44970,44972],{"class":114,"line":4949},[112,44971,32614],{"class":122},[112,44973,288],{"class":236},[112,44975,44976,44978],{"class":114,"line":4960},[112,44977,32621],{"class":122},[112,44979,288],{"class":236},[112,44981,44982,44984],{"class":114,"line":4972},[112,44983,32628],{"class":122},[112,44985,288],{"class":236},[112,44987,44988,44990],{"class":114,"line":4984},[112,44989,32635],{"class":122},[112,44991,288],{"class":236},[112,44993,44994,44996],{"class":114,"line":4992},[112,44995,32642],{"class":122},[112,44997,288],{"class":236},[112,44999,45000],{"class":114,"line":5000},[112,45001,32649],{"class":122},[112,45003,45004],{"class":114,"line":5008},[112,45005,4450],{"class":236},[112,45007,45008,45010],{"class":114,"line":5016},[112,45009,32658],{"class":122},[112,45011,32661],{"class":236},[112,45013,45014,45016],{"class":114,"line":5024},[112,45015,32666],{"class":122},[112,45017,32669],{"class":236},[112,45019,45020],{"class":114,"line":5032},[112,45021,988],{"class":236},[112,45023,45024,45026],{"class":114,"line":5040},[112,45025,32678],{"class":122},[112,45027,3888],{"class":236},[112,45029,45030,45032,45034,45036],{"class":114,"line":5046},[112,45031,32685],{"class":122},[112,45033,3903],{"class":236},[112,45035,32690],{"class":122},[112,45037,3908],{"class":236},[112,45039,45040,45042],{"class":114,"line":5052},[112,45041,32697],{"class":122},[112,45043,32661],{"class":236},[112,45045,45046,45048],{"class":114,"line":5061},[112,45047,32704],{"class":122},[112,45049,32669],{"class":236},[112,45051,45052],{"class":114,"line":5066},[112,45053,988],{"class":236},[112,45055,45056,45058],{"class":114,"line":9217},[112,45057,32715],{"class":122},[112,45059,3888],{"class":236},[112,45061,45062,45064,45066,45068],{"class":114,"line":9225},[112,45063,32722],{"class":122},[112,45065,2335],{"class":236},[112,45067,32727],{"class":122},[112,45069,288],{"class":236},[112,45071,45072,45074,45076,45078],{"class":114,"line":9237},[112,45073,32734],{"class":122},[112,45075,2335],{"class":236},[112,45077,32739],{"class":122},[112,45079,288],{"class":236},[112,45081,45082,45084,45086,45088],{"class":114,"line":9248},[112,45083,32746],{"class":122},[112,45085,2335],{"class":236},[112,45087,32751],{"class":122},[112,45089,288],{"class":236},[112,45091,45092,45094,45096],{"class":114,"line":9253},[112,45093,32758],{"class":122},[112,45095,2335],{"class":236},[112,45097,32763],{"class":122},[112,45099,45100],{"class":114,"line":9261},[112,45101,3946],{"class":236},[112,45103,45104],{"class":114,"line":9267},[112,45105,1476],{"class":236},[112,45107,45108],{"class":114,"line":9272},[112,45109,584],{"class":236},[43,45111,45112],{},[46,45113,32780],{},[102,45115,45116],{"className":9951,"code":25926,"language":9953,"meta":107,"style":107},[109,45117,45118],{"__ignoreMap":107},[112,45119,45120],{"class":114,"line":115},[112,45121,25926],{"class":236},[43,45123,45124],{},[46,45125,32793],{},[19,45127,45128],{},[1603,45129],{"alt":13589,"src":45130},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-1.png",[43,45132,45133],{},[46,45134,32803],{},[19,45136,45137],{},[1603,45138],{"alt":13589,"src":45139},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-2.png",[67,45141,45143],{"id":45142},"set-up-required-scopes-in-hubspot-legacy-app","Set up required scopes in HubSpot (Legacy App)",[19,45145,45146,45148,45149],{},[478,45147,13464],{},": If you are using webhooks, please refer to: ",[1614,45150,25318],{"href":35273,"rel":45151},[1618],[43,45153,45154,45159,45162,45165],{},[46,45155,11822,45156,44797],{},[1614,45157,32266],{"href":32266,"rel":45158},[1618],[46,45160,45161],{},"Development → Legacy App→ Your New App",[46,45163,45164],{},"In the same Auth tab, scroll",[46,45166,45167,45168,45171,45172,2335,45174,11338,45176,45178],{},"If you are not using webhooks, then ",[1614,45169,1640],{"href":1638,"rel":45170},[1618]," only requires two scopes to be set as ",[478,45173,2431],{},[109,45175,25489],{},[109,45177,25544],{},[43,45179,45180,45185,45189,45195],{},[46,45181,9757,45182],{},[478,45183,45184],{},"+ Add new scope",[46,45186,12267,45187],{},[109,45188,25489],{},[46,45190,45191,45192,45194],{},"Set it as a ",[478,45193,2431],{}," scope",[46,45196,36996],{},[19,45198,45199],{},[1603,45200],{"alt":13589,"src":45201},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-3.png",[67,45203,45205],{"id":45204},"setup-optional-scopes","Setup optional scopes",[43,45207,45208],{},[46,45209,45210,45211],{},"You can see the list of scopes required for the objects you need at ",[1614,45212,25538],{"href":25538,"rel":45213},[1618],[19,45215,45216],{},[1603,45217],{"alt":13589,"src":45218},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-4.png",[43,45220,45221],{},[46,45222,45223],{},"Make sure to select optional",[19,45225,45226],{},[1603,45227],{"alt":13589,"src":45228},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-5.png",[43,45230,45231,45234],{},[46,45232,45233],{},"Add all the scopes you need",[46,45235,36996],{},[35,45237,45239,45240],{"id":45238},"configure-your-scopes-on-unifiedto","Configure your scopes on ",[1614,45241,1640],{"href":1638,"rel":45242},[1618],[19,45244,45245,45246,45249,45250,634],{},"Be sure to also configure these scopes in your ",[1614,45247,1640],{"href":1638,"rel":45248},[1618]," settings. For instructions on how to do that, refer to our ",[1614,45251,45253],{"href":9872,"rel":45252},[1618],"Scopes guide",[67,45255,45257],{"id":45256},"understanding-hubspots-scope-constraints","Understanding HubSpot's scope constraints",[19,45259,45260],{},"HubSpot has some specific rules about how scopes work:",[72,45262,45263,45283,45288,45291],{},[46,45264,45265,45266,45268,45269],{},"If you specify a scope as ",[478,45267,2431],{},", it must be included in every authorization request.\n",[72,45270,45271],{},[46,45272,45273,45275,45276,45279,45280,45282],{},[478,45274,13464],{},": If you intend to ",[22,45277,45278],{},"read"," data via a webhook, then the read scope for that object must be marked as ",[478,45281,2431],{}," in HubSpot.",[46,45284,45285,45287],{},[478,45286,25519],{}," scopes may or may not be included in the authorization.",[46,45289,45290],{},"If you don't specify a scope at all, it cannot be included in the authorization request.",[46,45292,45293],{},"The OAuth scope cannot be removed and must always be required.",[19,45295,45296,45297,45300],{},"Behind the scenes, ",[1614,45298,1640],{"href":1638,"rel":45299},[1618]," will request scopes according to what you have configured on the platform:",[72,45302,45303,45311,45325],{},[46,45304,45305,45306,45308,45309,45194],{},"We'll always request ",[109,45307,25489],{}," as a ",[478,45310,2431],{},[46,45312,45313,45314,45316,45317,45320,45321,45324],{},"When you enable ",[109,45315,18788],{}," scopes on ",[1614,45318,1640],{"href":1638,"rel":45319},[1618],", we convert every Hubspot scope ending with ",[109,45322,45323],{},".read"," to required, assuming they'll all be used for webhooks.",[46,45326,45327,45328,45330,45331,634],{},"Otherwise, if you have not enabled the ",[109,45329,18788],{}," scope, then all other scopes will be requested as ",[478,45332,25519],{},[19,45334,45335,45336],{},"In general, we recommend that you only stick to requesting scopes for the data you actually need. For more instructions on setting up scopes to work with webhooks,  please refer to: ",[1614,45337,25318],{"href":35273,"rel":45338},[1618],[67,45340,45342],{"id":45341},"what-your-users-will-see","What your users will see",[19,45344,45345],{},"When your users sign in with HubSpot, they'll see a screen requesting access to the scopes you've specified:",[72,45347,45348,45351],{},[46,45349,45350],{},"Required scopes will always be shown and cannot be deselected.",[46,45352,45353],{},"Optional scopes will be shown and can be deselected by the user.",[19,45355,45356],{},[1603,45357],{"alt":13589,"src":45358},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-6.png",[67,45360,45362],{"id":45361},"specifying-required-vs-optional-scopes","Specifying Required vs Optional Scopes",[19,45364,45365,45366,45368],{},"Unified tries to automatically classify scopes as required or optional.  If you need additional control, you can always specify this information in the ",[109,45367,33719],{}," URL parameter.",[19,45370,45371,45372,9571,45375,45378],{},"Just prefix the Hubspot-specific scope with ",[109,45373,45374],{},"required:",[109,45376,45377],{},"optional:"," and we will handle them correctly.",[19,45380,45381],{},"eg.",[19,45383,45384],{},[109,45385,45386],{},"required:crm.objects.contacts.read",[67,45388,10128],{"id":10127},[19,45390,45391,45392,45395],{},"If your HubSpot scopes don't match the requested scopes via ",[1614,45393,1640],{"href":1638,"rel":45394},[1618],", your users may see an error message about there being a scopes mismatch.",[19,45397,45398],{},"Double-check that:",[43,45400,45401,45408,45415,45421],{},[46,45402,45403,45404,45407],{},"All scopes in your HubSpot app are included in every ",[1614,45405,1640],{"href":1638,"rel":45406},[1618]," request.",[46,45409,45410,45411,45414],{},"All scopes requested by ",[1614,45412,1640],{"href":1638,"rel":45413},[1618]," are specified (either as required or optional) in your HubSpot app.",[46,45416,45417,45418,45420],{},"If you're using webhooks, ensure all read scopes are set as ",[478,45419,2431],{}," in your HubSpot app.",[46,45422,45423,45424,11338,45426,45432,45433,634],{},"If you're not using webhooks, ensure all scopes aside from ",[109,45425,25544],{},[1614,45427,45430],{"href":45428,"rel":45429},"https://crm.objects.owners.read/",[1618],[109,45431,25489],{}," are set as ",[478,45434,25519],{},[67,45436,25945],{"id":25944},[72,45438,45439,45445,45450],{},[46,45440,45441],{},[1614,45442,45444],{"href":9872,"rel":45443},[1618],"Understanding scopes",[46,45446,45447],{},[1614,45448,25318],{"href":35273,"rel":45449},[1618],[46,45451,45452],{},[1614,45453,10169],{"href":37010,"rel":45454},[1618],[1558,45456,45457],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":45459},[45460,45461,45462,45463,45467,45468,45469,45470,45471],{"id":13633,"depth":126,"text":13634},{"id":44788,"depth":126,"text":44789},{"id":45142,"depth":126,"text":45143},{"id":45204,"depth":126,"text":45205,"children":45464},[45465],{"id":45238,"depth":135,"text":45466},"Configure your scopes on Unified.to",{"id":45256,"depth":126,"text":45257},{"id":45341,"depth":126,"text":45342},{"id":45361,"depth":126,"text":45362},{"id":10127,"depth":126,"text":10128},{"id":25944,"depth":126,"text":25945},"This guide explains how to correctly configure the advanced scopes settings in your HubSpot developer app for seamless integration with Unified.to. We'll cover...",{"img":45474,"date":45475,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-icon.png","2024-06-11T00:00:00.000Z","/guides/how_to_set_up_your_scopes_in_hubspot",{"title":25967,"description":45472},"guides/how_to_set_up_your_scopes_in_hubspot","i36i5bBd3CliiAwLM9D8wfSdWBxEjJYVqUj-TOdXk2w",{"id":45481,"title":45482,"body":45483,"description":45497,"extension":1576,"meta":45606,"navigation":271,"path":45609,"seo":45610,"stem":45611,"__hash__":45612},"guides/guides/how_to_setup_a_freshbooks_developer_app.md","How to setup a Freshbooks developer app",{"type":9,"value":45484,"toc":45602},[45485,45488,45490,45495,45498,45502,45515,45520,45545,45550,45560,45565,45570,45575,45579,45597],[12,45486,45482],{"id":45487},"how-to-setup-a-freshbooks-developer-app",[16,45489],{},[19,45491,45492],{},[22,45493,45494],{},"October 3, 2025",[19,45496,45497],{},"This guide will show you how to retrieve your OAuth 2 credentials on Freshbooks",[67,45499,45501],{"id":45500},"create-your-freshbooks-app-and-get-your-client-id-and-secret","Create your Freshbooks App and get your Client ID and Secret",[43,45503,45504,45511],{},[46,45505,45506,45507],{},"Go to the Freshbooks Developer Portal:\n",[1614,45508,45509],{"href":45509,"rel":45510},"https://my.freshbooks.com/#/developer",[1618],[46,45512,17161,45513],{},[109,45514,31197],{},[19,45516,45517],{},[1603,45518],{"alt":13589,"src":45519},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-0.png",[43,45521,45522,45525,45537],{},[46,45523,45524],{},"Fill in the Application Name, Application Type, these are mandatory",[46,45526,45527,45528],{},"Add the scopes needed\n",[43,45529,45530],{},[46,45531,45532,45533],{},"You can see the scopes we use on ",[1614,45534,45535],{"href":45535,"rel":45536},"https://app.unified.to/integrations/freshbooks?tab=oauth2",[1618],[46,45538,25486,45539,45544],{},[1614,45540,45542],{"href":34368,"rel":45541},[1618],[109,45543,34368],{}," in the Redirect URIs",[19,45546,45547],{},[1603,45548],{"alt":13589,"src":45549},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-1.png",[43,45551,45552,45555,45557],{},[46,45553,45554],{},"You can also fill in the non mandatory fields, logo, etc.",[46,45556,34876],{},[46,45558,45559],{},"Click on the App again",[19,45561,45562],{},[1603,45563],{"alt":13589,"src":45564},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-2.png",[43,45566,45567],{},[46,45568,45569],{},"Your Client ID and Secret are at the bottom",[19,45571,45572],{},[1603,45573],{"alt":13589,"src":45574},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-3.png",[67,45576,45578],{"id":45577},"activate-the-freshbooks-integration-in-unified","Activate the Freshbooks Integration in Unified",[43,45580,45581,45587,45592,45595],{},[46,45582,11822,45583],{},[1614,45584,45585],{"href":45585,"rel":45586},"https://app.unified.to/integrations/freshbooks?tab=auth",[1618],[46,45588,45589,45590],{},"Click in ",[109,45591,35252],{},[46,45593,45594],{},"Add your Client ID and Secret",[46,45596,31033],{},[19,45598,45599],{},[1603,45600],{"alt":13589,"src":45601},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-4.png",{"title":107,"searchDepth":126,"depth":126,"links":45603},[45604,45605],{"id":45500,"depth":126,"text":45501},{"id":45577,"depth":126,"text":45578},{"img":45607,"date":45608,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-icon.png","2025-10-03T00:00:00.000Z","/guides/how_to_setup_a_freshbooks_developer_app",{"title":45482,"description":45497},"guides/how_to_setup_a_freshbooks_developer_app","f1cGCAK2gmo_mOov7yTxq-9RRWSL_Q3cSDbQmr2VtrU",{"id":45614,"title":45615,"body":45616,"description":46297,"extension":1576,"meta":46298,"navigation":271,"path":46300,"seo":46301,"stem":46302,"__hash__":46303},"guides/guides/how_to_setup_aws_assume_role_for_aws_secret_manager.md","How to Setup AWS Assume Role for AWS Secret Manager",{"type":9,"value":45617,"toc":46279},[45618,45621,45623,45628,45631,45633,45636,45640,45675,45693,45695,45703,45707,45710,45864,45868,46045,46049,46131,46135,46138,46149,46151,46155,46163,46167,46191,46195,46198,46202,46213,46217,46220,46234,46238,46277],[12,45619,45615],{"id":45620},"how-to-setup-aws-assume-role-for-aws-secret-manager",[16,45622],{},[19,45624,45625],{},[22,45626,45627],{},"March 12, 2026",[19,45629,45630],{},"This guide walks you through configuring AWS IAM Assume Role so that Unified can securely access AWS Secrets Manager in your account — without sharing long-lived AWS access keys.",[67,45632,9690],{"id":9689},[19,45634,45635],{},"Instead of providing static AWS credentials (access key + secret), you can create an IAM role in your AWS account and grant Unified permission to assume it. Unified uses AWS STS (Security Token Service) to obtain short-lived, temporary credentials scoped to your Secrets Manager.",[35,45637,45639],{"id":45638},"how-it-works","How it works",[102,45641,45643],{"className":174,"code":45642,"language":176,"meta":177,"style":107},"┌───────────────┐         STS AssumeRole          ┌────────────────────┐\n│  Unified API  │ ──────────────────────────────► │  Your AWS Account  │\n│  (account     │   (with External ID check)      │                    │\n│   944579081756│ ◄────────────────────────────── │  IAM Role          │\n└───────────────┘    temporary credentials        │  Secrets Manager   │\n                                                  └────────────────────┘\n",[109,45644,45645,45650,45655,45660,45665,45670],{"__ignoreMap":107},[112,45646,45647],{"class":114,"line":115},[112,45648,45649],{},"┌───────────────┐         STS AssumeRole          ┌────────────────────┐\n",[112,45651,45652],{"class":114,"line":126},[112,45653,45654],{},"│  Unified API  │ ──────────────────────────────► │  Your AWS Account  │\n",[112,45656,45657],{"class":114,"line":135},[112,45658,45659],{},"│  (account     │   (with External ID check)      │                    │\n",[112,45661,45662],{"class":114,"line":147},[112,45663,45664],{},"│   944579081756│ ◄────────────────────────────── │  IAM Role          │\n",[112,45666,45667],{"class":114,"line":202},[112,45668,45669],{},"└───────────────┘    temporary credentials        │  Secrets Manager   │\n",[112,45671,45672],{"class":114,"line":208},[112,45673,45674],{},"                                                  └────────────────────┘\n",[43,45676,45677,45680,45683,45686],{},[46,45678,45679],{},"You create an IAM role in your AWS account with a trust policy that allows Unified's AWS account to assume it.",[46,45681,45682],{},"You attach a permissions policy to that role granting access to Secrets Manager.",[46,45684,45685],{},"You provide the role's ARN and an External ID in the Unified dashboard.",[46,45687,45688,45689,45692],{},"Unified calls ",[109,45690,45691],{},"sts:AssumeRole"," with the External ID, receives temporary credentials, and uses them to read/write secrets.",[67,45694,70],{"id":69},[72,45696,45697,45700],{},[46,45698,45699],{},"An AWS account with permissions to create IAM roles and policies",[46,45701,45702],{},"Access to the Unified dashboard with workspace admin permissions",[67,45704,45706],{"id":45705},"step-1-create-an-iam-policy-for-secrets-manager","Step 1: Create an IAM Policy for Secrets Manager",[19,45708,45709],{},"In the AWS Console, create a policy that grants the permissions Unified needs on Secrets Manager.",[43,45711,45712,45722,45857],{},[46,45713,11822,45714,31757,45717,31757,45719],{},[478,45715,45716],{},"IAM",[478,45718,40782],{},[478,45720,45721],{},"Create policy",[46,45723,12325,45724,45726,45727,45830,45832,45833,45836,45837,45840,45841,45844,45845,45847,45849,45850,45853,45854],{},[478,45725,13765],{}," tab and paste the following:",[102,45728,45730],{"className":2318,"code":45729,"language":2320,"meta":107,"style":107},"{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"secretsmanager:CreateSecret\",\n                \"secretsmanager:GetSecretValue\",\n                \"secretsmanager:UpdateSecret\",\n                \"secretsmanager:DeleteSecret\"\n            ],\n            \"Resource\": \"arn:aws:secretsmanager:YOUR_REGION:YOUR_ACCOUNT_ID:secret:*\"\n        }\n    ]\n}\n",[109,45731,45732,45736,45748,45755,45759,45771,45778,45785,45792,45799,45804,45808,45818,45822,45826],{"__ignoreMap":107},[112,45733,45734],{"class":114,"line":115},[112,45735,2327],{"class":236},[112,45737,45738,45741,45743,45746],{"class":114,"line":126},[112,45739,45740],{"class":129},"    \"Version\"",[112,45742,2335],{"class":236},[112,45744,45745],{"class":122},"\"2012-10-17\"",[112,45747,288],{"class":236},[112,45749,45750,45753],{"class":114,"line":135},[112,45751,45752],{"class":129},"    \"Statement\"",[112,45754,2372],{"class":236},[112,45756,45757],{"class":114,"line":147},[112,45758,4001],{"class":236},[112,45760,45761,45764,45766,45769],{"class":114,"line":202},[112,45762,45763],{"class":129},"            \"Effect\"",[112,45765,2335],{"class":236},[112,45767,45768],{"class":122},"\"Allow\"",[112,45770,288],{"class":236},[112,45772,45773,45776],{"class":114,"line":208},[112,45774,45775],{"class":129},"            \"Action\"",[112,45777,2372],{"class":236},[112,45779,45780,45783],{"class":114,"line":291},[112,45781,45782],{"class":122},"                \"secretsmanager:CreateSecret\"",[112,45784,288],{"class":236},[112,45786,45787,45790],{"class":114,"line":299},[112,45788,45789],{"class":122},"                \"secretsmanager:GetSecretValue\"",[112,45791,288],{"class":236},[112,45793,45794,45797],{"class":114,"line":307},[112,45795,45796],{"class":122},"                \"secretsmanager:UpdateSecret\"",[112,45798,288],{"class":236},[112,45800,45801],{"class":114,"line":315},[112,45802,45803],{"class":122},"                \"secretsmanager:DeleteSecret\"\n",[112,45805,45806],{"class":114,"line":323},[112,45807,5049],{"class":236},[112,45809,45810,45813,45815],{"class":114,"line":329},[112,45811,45812],{"class":129},"            \"Resource\"",[112,45814,2335],{"class":236},[112,45816,45817],{"class":122},"\"arn:aws:secretsmanager:YOUR_REGION:YOUR_ACCOUNT_ID:secret:*\"\n",[112,45819,45820],{"class":114,"line":341},[112,45821,4052],{"class":236},[112,45823,45824],{"class":114,"line":346},[112,45825,39498],{"class":236},[112,45827,45828],{"class":114,"line":366},[112,45829,584],{"class":236},[17180,45831],{},"Replace ",[109,45834,45835],{},"YOUR_REGION"," (e.g. ",[109,45838,45839],{},"us-east-1",") and ",[109,45842,45843],{},"YOUR_ACCOUNT_ID"," with your values.",[17180,45846],{},[478,45848,38372],{}," To restrict access further, you can narrow the ",[109,45851,45852],{},"Resource"," to a specific prefix, for example:\n",[109,45855,45856],{},"arn:aws:secretsmanager:us-east-1:123456789012:secret:unified/*",[46,45858,45859,45860,45863],{},"Name the policy (e.g. ",[109,45861,45862],{},"UnifiedSecretsManagerAccess",") and create it.",[67,45865,45867],{"id":45866},"step-2-create-an-iam-role-with-a-trust-policy","Step 2: Create an IAM Role with a Trust Policy",[43,45869,45870,45880,46021,46029,46035],{},[46,45871,11822,45872,31757,45874,31757,45877],{},[478,45873,45716],{},[478,45875,45876],{},"Roles",[478,45878,45879],{},"Create role",[46,45881,12267,45882,45885,45886,46003,45832,46005,46008,46009,46011,46014,46015,46020],{},[478,45883,45884],{},"Custom trust policy"," and paste the following:",[102,45887,45889],{"className":2318,"code":45888,"language":2320,"meta":107,"style":107},"{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Principal\": {\n                \"AWS\": \"arn:aws:iam::944579081756:user/unified_assume_role_user\"\n            },\n            \"Action\": \"sts:AssumeRole\",\n            \"Condition\": {\n                \"StringEquals\": {\n                    \"sts:ExternalId\": \"YOUR_EXTERNAL_ID\"\n                }\n            }\n        }\n    ]\n}\n",[109,45890,45891,45895,45905,45911,45915,45925,45932,45942,45947,45958,45965,45972,45982,45987,45991,45995,45999],{"__ignoreMap":107},[112,45892,45893],{"class":114,"line":115},[112,45894,2327],{"class":236},[112,45896,45897,45899,45901,45903],{"class":114,"line":126},[112,45898,45740],{"class":129},[112,45900,2335],{"class":236},[112,45902,45745],{"class":122},[112,45904,288],{"class":236},[112,45906,45907,45909],{"class":114,"line":135},[112,45908,45752],{"class":129},[112,45910,2372],{"class":236},[112,45912,45913],{"class":114,"line":147},[112,45914,4001],{"class":236},[112,45916,45917,45919,45921,45923],{"class":114,"line":202},[112,45918,45763],{"class":129},[112,45920,2335],{"class":236},[112,45922,45768],{"class":122},[112,45924,288],{"class":236},[112,45926,45927,45930],{"class":114,"line":208},[112,45928,45929],{"class":129},"            \"Principal\"",[112,45931,3888],{"class":236},[112,45933,45934,45937,45939],{"class":114,"line":291},[112,45935,45936],{"class":129},"                \"AWS\"",[112,45938,2335],{"class":236},[112,45940,45941],{"class":122},"\"arn:aws:iam::944579081756:user/unified_assume_role_user\"\n",[112,45943,45944],{"class":114,"line":299},[112,45945,45946],{"class":236},"            },\n",[112,45948,45949,45951,45953,45956],{"class":114,"line":307},[112,45950,45775],{"class":129},[112,45952,2335],{"class":236},[112,45954,45955],{"class":122},"\"sts:AssumeRole\"",[112,45957,288],{"class":236},[112,45959,45960,45963],{"class":114,"line":315},[112,45961,45962],{"class":129},"            \"Condition\"",[112,45964,3888],{"class":236},[112,45966,45967,45970],{"class":114,"line":323},[112,45968,45969],{"class":129},"                \"StringEquals\"",[112,45971,3888],{"class":236},[112,45973,45974,45977,45979],{"class":114,"line":329},[112,45975,45976],{"class":129},"                    \"sts:ExternalId\"",[112,45978,2335],{"class":236},[112,45980,45981],{"class":122},"\"YOUR_EXTERNAL_ID\"\n",[112,45983,45984],{"class":114,"line":341},[112,45985,45986],{"class":236},"                }\n",[112,45988,45989],{"class":114,"line":346},[112,45990,28745],{"class":236},[112,45992,45993],{"class":114,"line":366},[112,45994,4052],{"class":236},[112,45996,45997],{"class":114,"line":381},[112,45998,39498],{"class":236},[112,46000,46001],{"class":114,"line":387},[112,46002,584],{"class":236},[17180,46004],{},[109,46006,46007],{},"YOUR_EXTERNAL_ID"," with a unique, hard-to-guess string of your choice (e.g. a UUID). You will enter this same value in the Unified dashboard later.",[17180,46010],{},[478,46012,46013],{},"Why an External ID?"," The External ID prevents the ",[1614,46016,46019],{"href":46017,"rel":46018},"https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html",[1618],"confused deputy problem",". It ensures that only requests originating through your Unified workspace — and not a third party who happens to know the role ARN — can assume the role.",[46,46022,9757,46023,46025,46026,46028],{},[478,46024,34121],{},", then attach the ",[109,46027,45862],{}," policy you created in Step 1.",[46,46030,46031,46032,45863],{},"Name the role (e.g. ",[109,46033,46034],{},"UnifiedSecretsManagerRole",[46,46036,46037,46038,46041,46042],{},"Copy the role's ",[478,46039,46040],{},"ARN"," from the role summary page. It will look like:\n",[109,46043,46044],{},"arn:aws:iam::123456789012:role/UnifiedSecretsManagerRole",[67,46046,46048],{"id":46047},"step-3-configure-unified","Step 3: Configure Unified",[43,46050,46051,46058,46065,46071,46128],{},[46,46052,46053,46054,634],{},"Log in to the ",[1614,46055,46057],{"href":11523,"rel":46056},[1618],"Unified dashboard",[46,46059,9735,46060,31757,46062,634],{},[478,46061,25570],{},[478,46063,46064],{},"Workspace Settings",[46,46066,46067,46068,634],{},"Under the secrets manager section, select ",[478,46069,46070],{},"AWS Secret Manager",[46,46072,46073,46074,46120,46122,46124,46125,46127],{},"Fill in the following fields:",[1868,46075,46076,46084],{},[1871,46077,46078],{},[1874,46079,46080,46082],{},[1877,46081,2425],{},[1877,46083,36342],{},[1890,46085,46086,46098,46110],{},[1874,46087,46088,46093],{},[1895,46089,46090],{},[478,46091,46092],{},"AWS Region",[1895,46094,46095,46096,610],{},"The region where your Secrets Manager secrets are stored (e.g. ",[109,46097,45839],{},[1874,46099,46100,46105],{},[1895,46101,46102],{},[478,46103,46104],{},"AWS ARN",[1895,46106,46107,46108,610],{},"The full ARN of the IAM role you created (e.g. ",[109,46109,46044],{},[1874,46111,46112,46117],{},[1895,46113,46114],{},[478,46115,46116],{},"AWS External ID",[1895,46118,46119],{},"The same External ID string you used in the trust policy",[17180,46121],{},[478,46123,12467],{}," When using Assume Role, you do ",[478,46126,25455],{}," need to fill in the AWS Key and AWS Secret fields. Those fields are only required for the static-credentials approach.",[46,46129,46130],{},"Save your workspace settings.",[67,46132,46134],{"id":46133},"step-4-verify-the-setup","Step 4: Verify the Setup",[19,46136,46137],{},"Once saved, Unified will automatically use the Assume Role flow for all new connections in your workspace. To verify:",[43,46139,46140,46143,46146],{},[46,46141,46142],{},"Create or update a connection in your workspace.",[46,46144,46145],{},"Check your AWS Secrets Manager console — you should see a new secret created with a name that includes your workspace ID.",[46,46147,46148],{},"If there are any issues, Unified will surface errors in the connection status.",[67,46150,10128],{"id":10127},[35,46152,46154],{"id":46153},"missing-role-arn-or-region","'Missing role ARN or region'",[19,46156,46157,46158,11338,46160,46162],{},"Ensure both the ",[478,46159,46092],{},[478,46161,46104],{}," fields are filled in on your workspace settings.",[35,46164,46166],{"id":46165},"access-denied-or-not-authorized-to-perform-stsassumerole","'Access Denied' or 'Not authorized to perform sts:AssumeRole'",[72,46168,46169,46179,46184],{},[46,46170,46171,46172,46175,46176],{},"Verify the ",[478,46173,46174],{},"trust policy"," on your IAM role references the correct Unified AWS principal:\n",[109,46177,46178],{},"arn:aws:iam::944579081756:user/unified_assume_role_user",[46,46180,46171,46181,46183],{},[478,46182,13979],{}," in the trust policy matches exactly what you entered in Unified.",[46,46185,46186,46187,46190],{},"Ensure the IAM role's permissions policy includes the required ",[109,46188,46189],{},"secretsmanager:*"," actions.",[35,46192,46194],{"id":46193},"the-security-token-included-in-the-request-is-expired","'The security token included in the request is expired'",[19,46196,46197],{},"Temporary credentials are cached for up to 55 minutes and refreshed automatically. If you see this error persistently, confirm that your IAM role allows a session duration of at least 1 hour (the default).",[35,46199,46201],{"id":46200},"secrets-are-not-being-stored","Secrets are not being stored",[72,46203,46204,46207],{},[46,46205,46206],{},"Confirm the IAM role's permissions policy allows actions on the correct region and account.",[46,46208,46209,46210,46212],{},"Check that the ",[109,46211,45852],{}," in your permissions policy matches the region configured in Unified.",[67,46214,46216],{"id":46215},"migrating-from-static-credentials","Migrating from Static Credentials",[19,46218,46219],{},"If you are currently using the static AWS Key / AWS Secret approach:",[43,46221,46222,46225,46228,46231],{},[46,46223,46224],{},"Follow Steps 1-3 above to set up the IAM role and configure Unified.",[46,46226,46227],{},"Once the ARN and External ID are saved, Unified will prefer the Assume Role flow over static credentials.",[46,46229,46230],{},"After verifying that secrets are being read and written correctly, you can remove the static AWS Key and AWS Secret from your workspace settings.",[46,46232,46233],{},"Revoke or delete the old IAM user credentials in your AWS account.",[67,46235,46237],{"id":46236},"security-best-practices","Security Best Practices",[72,46239,46240,46246,46255,46261,46271],{},[46,46241,46242,46245],{},[478,46243,46244],{},"Use a unique External ID per workspace."," This prevents cross-workspace role assumption.",[46,46247,46248,46251,46252,46254],{},[478,46249,46250],{},"Scope the permissions policy narrowly."," Restrict the ",[109,46253,45852],{}," to only the secret prefixes Unified needs.",[46,46256,46257,46260],{},[478,46258,46259],{},"Rotate the External ID periodically."," Update both the IAM trust policy and the Unified dashboard when you do.",[46,46262,46263,46266,46267,46270],{},[478,46264,46265],{},"Enable CloudTrail logging."," Monitor ",[109,46268,46269],{},"AssumeRole"," events in your AWS account to audit access.",[46,46272,46273,46276],{},[478,46274,46275],{},"Do not share the External ID publicly."," Treat it as a sensitive configuration value.",[1558,46278,38653],{},{"title":107,"searchDepth":126,"depth":126,"links":46280},[46281,46284,46285,46286,46287,46288,46289,46295,46296],{"id":9689,"depth":126,"text":9690,"children":46282},[46283],{"id":45638,"depth":135,"text":45639},{"id":69,"depth":126,"text":70},{"id":45705,"depth":126,"text":45706},{"id":45866,"depth":126,"text":45867},{"id":46047,"depth":126,"text":46048},{"id":46133,"depth":126,"text":46134},{"id":10127,"depth":126,"text":10128,"children":46290},[46291,46292,46293,46294],{"id":46153,"depth":135,"text":46154},{"id":46165,"depth":135,"text":46166},{"id":46193,"depth":135,"text":46194},{"id":46200,"depth":135,"text":46201},{"id":46215,"depth":126,"text":46216},{"id":46236,"depth":126,"text":46237},"This guide walks you through configuring AWS IAM Assume Role so that Unified can securely access AWS Secrets Manager in your account — without sharing...",{"img":31148,"date":46299,"tag":1580},"2026-03-12T15:37:00.000Z","/guides/how_to_setup_aws_assume_role_for_aws_secret_manager",{"title":45615,"description":46297},"guides/how_to_setup_aws_assume_role_for_aws_secret_manager","DVyjaiMVRTbQYGAykV1ufgrZAE-oh16nQ9BtzYmVZo8",{"id":46305,"title":46306,"body":46307,"description":46320,"extension":1576,"meta":46685,"navigation":271,"path":46688,"seo":46689,"stem":46690,"__hash__":46691},"guides/guides/how_to_setup_quickbooks_desktop.md","How to Setup Quickbooks Desktop",{"type":9,"value":46308,"toc":46683},[46309,46312,46314,46318,46321,46680],[12,46310,46306],{"id":46311},"how-to-setup-quickbooks-desktop",[16,46313],{},[19,46315,46316],{},[22,46317,31168],{},[19,46319,46320],{},"Quickbooks Desktop/Enterprise is a desktop application and not a web/online application, and thus needs additional setup to enable API access.",[43,46322,46323,46331,46340,46349,46632,46635,46644,46653,46662,46671],{},[46,46324,46325,46330],{},[1614,46326,46329],{"href":46327,"rel":46328},"https://quickbooks.intuit.com/learn-support/en-ca/help-article/install-products/set-quickbooks-web-connector/L4Vp7VI44_CA_en_CA",[1618],"Download QBWC"," (Web Connector) from Quickbooks and install the program on the same computer where your Quickbooks Desktop is running.",[46,46332,46333,46334,46336],{},"Activate Quickbooks Desktop Integration in your workspace",[17180,46335],{},[1603,46337],{"alt":46338,"src":46339},"Screenshot_2026-04-02_at_10.37.30_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-0.png",[46,46341,46342,46343,46345],{},"Create a Quickbooks Desktop connection within Unified (enter your username and password you will use in the QBWC)",[17180,46344],{},[1603,46346],{"alt":46347,"src":46348},"Screenshot_2026-04-02_at_10.39.37_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-1.png",[46,46350,46351,46352],{},"Create a .qwc file, it should be in the following format:",[102,46353,46355],{"className":9951,"code":46354,"language":9953,"meta":107,"style":107},"\u003C?xml version=\"1.0\"?>\n\u003CQBWCXML>\n\u003CAppName>Unified\u003C/AppName>\n\u003CAppID>\u003C/AppID>\n\u003CAppURL>\nhttps://api.unified.to/webhook/workspace/quickbooksdesktop?workspace_id=your_workspace_id&amp;connection_id=\nyour_quickbooks_desktop_connection_id\u003C/AppURL>\n\u003CAppDescription>A short description for WCWebService1\u003C/AppDescription>\n\u003CAppSupport>\nhttps://unified.ngrok.dev/support\n\u003C/AppSupport>\n\u003CUserName>your_username\u003C/UserName>\n\u003COwnerID>{57F3B9B1-86F1-4fcc-B1EE-566DE1813D21}\u003C/OwnerID>\n\u003CFileID>{90A44FB5-33D9-4815-AC85-BC87A7E7D1EZ}\u003C/FileID>\n\u003CQBType>QBFS\u003C/QBType>\n\u003CScheduler>\n\u003CRunEveryNMinutes>number_of_minutes_between_each_sync_or_remove_this_if_you_want_to_sync_manually\u003C/RunEveryNMinutes>\n\u003C/Scheduler>\n\u003C/QBWCXML>\n",[109,46356,46357,46373,46383,46397,46411,46420,46431,46440,46454,46463,46468,46477,46491,46537,46579,46593,46602,46616,46624],{"__ignoreMap":107},[112,46358,46359,46362,46365,46367,46370],{"class":114,"line":115},[112,46360,46361],{"class":229},"\u003C?",[112,46363,46364],{"class":236},"xml version",[112,46366,335],{"class":229},[112,46368,46369],{"class":122},"\"1.0\"",[112,46371,46372],{"class":229},"?>\n",[112,46374,46375,46377,46380],{"class":114,"line":126},[112,46376,14970],{"class":236},[112,46378,46379],{"class":129},"QBWCXML",[112,46381,46382],{"class":236},">\n",[112,46384,46385,46387,46390,46393,46395],{"class":114,"line":135},[112,46386,14970],{"class":236},[112,46388,46389],{"class":129},"AppName",[112,46391,46392],{"class":236},">Unified\u003C/",[112,46394,46389],{"class":129},[112,46396,46382],{"class":236},[112,46398,46399,46401,46404,46407,46409],{"class":114,"line":147},[112,46400,14970],{"class":236},[112,46402,46403],{"class":129},"AppID",[112,46405,46406],{"class":236},">\u003C/",[112,46408,46403],{"class":129},[112,46410,46382],{"class":236},[112,46412,46413,46415,46418],{"class":114,"line":202},[112,46414,14970],{"class":236},[112,46416,46417],{"class":129},"AppURL",[112,46419,46382],{"class":236},[112,46421,46422,46425,46428],{"class":114,"line":208},[112,46423,46424],{"class":236},"https://api.unified.to/webhook/workspace/quickbooksdesktop?workspace_id=your_workspace_id",[112,46426,46427],{"class":129},"&amp;",[112,46429,46430],{"class":236},"connection_id=\n",[112,46432,46433,46436,46438],{"class":114,"line":291},[112,46434,46435],{"class":236},"your_quickbooks_desktop_connection_id\u003C/",[112,46437,46417],{"class":129},[112,46439,46382],{"class":236},[112,46441,46442,46444,46447,46450,46452],{"class":114,"line":299},[112,46443,14970],{"class":236},[112,46445,46446],{"class":129},"AppDescription",[112,46448,46449],{"class":236},">A short description for WCWebService1\u003C/",[112,46451,46446],{"class":129},[112,46453,46382],{"class":236},[112,46455,46456,46458,46461],{"class":114,"line":307},[112,46457,14970],{"class":236},[112,46459,46460],{"class":129},"AppSupport",[112,46462,46382],{"class":236},[112,46464,46465],{"class":114,"line":315},[112,46466,46467],{"class":236},"https://unified.ngrok.dev/support\n",[112,46469,46470,46473,46475],{"class":114,"line":323},[112,46471,46472],{"class":236},"\u003C/",[112,46474,46460],{"class":129},[112,46476,46382],{"class":236},[112,46478,46479,46481,46484,46487,46489],{"class":114,"line":329},[112,46480,14970],{"class":236},[112,46482,46483],{"class":129},"UserName",[112,46485,46486],{"class":236},">your_username\u003C/",[112,46488,46483],{"class":129},[112,46490,46382],{"class":236},[112,46492,46493,46495,46498,46501,46504,46506,46509,46512,46514,46517,46519,46522,46524,46527,46530,46533,46535],{"class":114,"line":341},[112,46494,14970],{"class":236},[112,46496,46497],{"class":129},"OwnerID",[112,46499,46500],{"class":236},">{57",[112,46502,46503],{"class":129},"F3B9B1",[112,46505,23301],{"class":229},[112,46507,46508],{"class":236},"86",[112,46510,46511],{"class":129},"F1",[112,46513,23301],{"class":229},[112,46515,46516],{"class":236},"4fcc",[112,46518,23301],{"class":229},[112,46520,46521],{"class":129},"B1EE",[112,46523,23301],{"class":229},[112,46525,46526],{"class":236},"566",[112,46528,46529],{"class":129},"DE1813D21",[112,46531,46532],{"class":236},"}\u003C/",[112,46534,46497],{"class":129},[112,46536,46382],{"class":236},[112,46538,46539,46541,46544,46547,46550,46552,46555,46558,46560,46563,46565,46568,46570,46573,46575,46577],{"class":114,"line":346},[112,46540,14970],{"class":236},[112,46542,46543],{"class":129},"FileID",[112,46545,46546],{"class":236},">{90",[112,46548,46549],{"class":129},"A44FB5",[112,46551,23301],{"class":229},[112,46553,46554],{"class":236},"33",[112,46556,46557],{"class":129},"D9",[112,46559,23301],{"class":229},[112,46561,46562],{"class":129},"4815",[112,46564,23301],{"class":229},[112,46566,46567],{"class":129},"AC85",[112,46569,23301],{"class":229},[112,46571,46572],{"class":129},"BC87A7E7D1EZ",[112,46574,46532],{"class":236},[112,46576,46543],{"class":129},[112,46578,46382],{"class":236},[112,46580,46581,46583,46586,46589,46591],{"class":114,"line":366},[112,46582,14970],{"class":236},[112,46584,46585],{"class":129},"QBType",[112,46587,46588],{"class":236},">QBFS\u003C/",[112,46590,46585],{"class":129},[112,46592,46382],{"class":236},[112,46594,46595,46597,46600],{"class":114,"line":381},[112,46596,14970],{"class":236},[112,46598,46599],{"class":129},"Scheduler",[112,46601,46382],{"class":236},[112,46603,46604,46606,46609,46612,46614],{"class":114,"line":387},[112,46605,14970],{"class":236},[112,46607,46608],{"class":129},"RunEveryNMinutes",[112,46610,46611],{"class":236},">number_of_minutes_between_each_sync_or_remove_this_if_you_want_to_sync_manually\u003C/",[112,46613,46608],{"class":129},[112,46615,46382],{"class":236},[112,46617,46618,46620,46622],{"class":114,"line":392},[112,46619,46472],{"class":236},[112,46621,46599],{"class":129},[112,46623,46382],{"class":236},[112,46625,46626,46628,46630],{"class":114,"line":409},[112,46627,46472],{"class":236},[112,46629,46379],{"class":129},[112,46631,46382],{"class":236},[46,46633,46634],{},"Once the QBWC has installed, first open your Quickbooks Desktop with the company you wish to sync",[46,46636,46637,46638,46640],{},"Then open QBWC and click 'Add an application', QBWC will then prompt you to select a file, select the newly created .qwc file from above.",[17180,46639],{},[1603,46641],{"alt":46642,"src":46643},"Screenshot_2026-04-02_at_10.41.19_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-2.png",[46,46645,46646,46647,46649],{},"Click 'Ok' to grant access",[17180,46648],{},[1603,46650],{"alt":46651,"src":46652},"Screenshot_2026-04-02_at_10.43.58_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-3.png",[46,46654,46655,46656,46658],{},"Select 'Yes, whenever my Quickbooks company file is open' and 'Continue'",[17180,46657],{},[1603,46659],{"alt":46660,"src":46661},"aaplication_permission_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-4.png",[46,46663,46664,46665,46667],{},"'Confirm'",[17180,46666],{},[1603,46668],{"alt":46669,"src":46670},"confirm_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-5.png",[46,46672,46673,46674,46676],{},"QBWC will normally close after this, you can reopen it and you should now see the app is added. Enter the password and to perform your first sync click 'Update Selected'.",[17180,46675],{},[1603,46677],{"alt":46678,"src":46679},"app_added_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-6.png",[1558,46681,46682],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":46684},[],{"img":46686,"date":46687,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-icon.png","2026-04-02T14:30:00.000Z","/guides/how_to_setup_quickbooks_desktop",{"title":46306,"description":46320},"guides/how_to_setup_quickbooks_desktop","wJvi4VM5Wh5wFQJgjdd07N_DHSrzoj_A74M2DmrsYKw",{"id":46693,"title":10169,"body":46694,"description":47371,"extension":1576,"meta":47372,"navigation":271,"path":47375,"seo":47376,"stem":47377,"__hash__":47378},"guides/guides/how_to_troubleshoot_unhealthy_connections.md",{"type":9,"value":46695,"toc":47351},[46696,46699,46701,46706,46709,46712,46714,46716,46723,46727,46730,46758,46762,46765,46791,46794,46797,46800,46813,46816,46854,46857,46861,46864,46868,46884,46888,46906,46912,46925,46929,46933,46936,46941,46949,46954,46968,46972,46978,46982,47005,47009,47031,47034,47058,47064,47118,47126,47129,47134,47147,47152,47155,47159,47164,47169,47174,47178,47181,47186,47191,47195,47210,47214,47217,47221,47229,47233,47244,47248,47251,47256,47264,47268,47271,47326,47328,47345,47348],[12,46697,10169],{"id":46698},"how-to-troubleshoot-unhealthy-connections",[16,46700],{},[19,46702,46703],{},[22,46704,46705],{},"September 25, 2024",[19,46707,46708],{},"Connections allow your application to securely access data from third-party API platforms. They serve as links between your Unified.to workspace, your customers' data, and your app.",[19,46710,46711],{},"Whether you're encountering issues during connection creation or debugging an existing connection that has become unhealthy, this guide will help you identify and resolve the problem. We'll walk you through how to interpret error messages, check connection status, and implement solutions to get your integrations running smoothly again.",[67,46713,13634],{"id":13633},[19,46715,44764],{},[72,46717,46718],{},[46,46719,46720],{},[1614,46721,25481],{"href":9872,"rel":46722},[1618],[67,46724,46726],{"id":46725},"connection-lifecycle","Connection lifecycle",[19,46728,46729],{},"Understanding the connection lifecycle can help in troubleshooting:",[43,46731,46732,46735,46738,46741,46744],{},[46,46733,46734],{},"Your customer selects an integration from your app to authorize.",[46,46736,46737],{},"Your customer is directed to the authorization page for that integration.",[46,46739,46740],{},"Unified.to determines what to display on the page (e.g. OAuth vs API token)",[46,46742,46743],{},"Your customer grants access to their account.",[46,46745,46746,46747],{},"Unified.to's server creates a connection in memory and attempts to test it immediately.\n",[43,46748,46749,46752],{},[46,46750,46751],{},"If tests pass, the connection is created in our database and your customer is redirected to the success URL you specified (defaults to the page they were on when they started the auth flow).",[46,46753,46754,46755],{},"If tests fail, the customer is redirected to the failure URL you specified with error details in the query parameters. See the below section: ",[478,46756,46757],{},"Handle errors during connection creation",[67,46759,46761],{"id":46760},"understanding-connection-health","Understanding connection health",[19,46763,46764],{},"Connections in Unified.to have different health statuses based on their recent activity:",[72,46766,46767,46773,46779,46785],{},[46,46768,46769,46772],{},[478,46770,46771],{},"Healthy",": The connection is working as expected.",[46,46774,46775,46778],{},[478,46776,46777],{},"Unhealthy",": The connection has failed and hasn't had a successful call since.",[46,46780,46781,46784],{},[478,46782,46783],{},"Unhealthy now",": The connection has had a recent failure after previous successes.",[46,46786,46787,46790],{},[478,46788,46789],{},"New",": The connection has been created but hasn't been used yet.",[19,46792,46793],{},"It's important to note that a connection can represent multiple objects and endpoints, each with its own potential for errors. Not all errors are terminal or indicative of a broken connection.",[67,46795,46757],{"id":46796},"handle-errors-during-connection-creation",[19,46798,46799],{},"When a connection fails to be created, we redirect users to the failure URL (this defaults to the page where the auth flow was initiated). The redirect URL includes two query parameters:",[72,46801,46802,46807],{},[46,46803,46804,46806],{},[109,46805,20134],{},": An error message",[46,46808,46809,46812],{},[109,46810,46811],{},"log_id",": The ID of the API call log entry for this failure",[19,46814,46815],{},"To properly handle these errors in your application:",[43,46817,46818,46844],{},[46,46819,46820,46823],{},[478,46821,46822],{},"Review the API call log:",[72,46824,46825,46835,46841],{},[46,46826,11822,46827,46834],{},[1614,46828,46831],{"href":46829,"rel":46830},"https://app.unified.to/logs",[1618],[478,46832,46833],{},"API Call Logs"," in your Unified.to dashboard",[46,46836,46837,46838,46840],{},"Look up the log entry using the ",[109,46839,46811],{}," from the URL",[46,46842,46843],{},"Examine the error message and status code to understand what went wrong",[46,46845,46846,46849],{},[478,46847,46848],{},"Implement error handling in your app",[43,46850,46851],{},[46,46852,46853],{},"For example, you may want to display a friendly message to your users, log the error in your monitoring tool, or invite them to contact support",[19,46855,46856],{},"Review the section below, 'Troubleshooting by connection error codes', for a detailed walkthrough of the possible error codes and how to handle them.",[67,46858,46860],{"id":46859},"handle-errors-after-a-connection-is-created","Handle errors after a connection is created",[19,46862,46863],{},"When a connection is created successfully but becomes unhealthy later on, the first place to look for debugging information is in the API call logs.",[35,46865,46867],{"id":46866},"_1-check-the-connection-status","1. Check the connection status",[43,46869,46870,46877],{},[46,46871,9926,46872,9903],{},[1614,46873,46875],{"href":17157,"rel":46874},[1618],[478,46876,9706],{},[46,46878,46879,46880,9571,46882,634],{},"Look for connections marked as ",[478,46881,46777],{},[478,46883,46783],{},[35,46885,46887],{"id":46886},"_2-review-api-call-logs","2. Review API call logs",[43,46889,46890,46897,46900,46903],{},[46,46891,11822,46892,634],{},[1614,46893,46895],{"href":46829,"rel":46894},[1618],[478,46896,46833],{},[46,46898,46899],{},"Filter the logs by the connection ID of the unhealthy connection (note: we only store logs from the past 60 days).",[46,46901,46902],{},"Look for recent error logs (status codes 400 and above).",[46,46904,46905],{},"Click on an error log to view details about the failed API call.",[19,46907,46908,46909,46911],{},"You can also use the Unified API to retrieve a list of your connections and API call logs. Pass the ",[109,46910,2886],{}," to the API calls endpoint to filter by that connection.",[19,46913,46914,2251,46916,1046,46921],{},[478,46915,18117],{},[1614,46917,46920],{"href":46918,"rel":46919},"https://docs.unified.to/unified/connection/List_all_connections",[1618],"List all connections",[1614,46922,46924],{"href":12721,"rel":46923},[1618],"List all API calls",[67,46926,46928],{"id":46927},"troubleshooting-by-connection-error-codes","Troubleshooting by connection error codes",[35,46930,46932],{"id":46931},"authentication-401","Authentication (401)",[19,46934,46935],{},"A 401 error is likely indicative that the connection is broken and requires recreation.",[19,46937,46938],{},[478,46939,46940],{},"Possible causes:",[72,46942,46943,46946],{},[46,46944,46945],{},"Your app's access to the provider has been revoked.",[46,46947,46948],{},"In non-OAuth flows that ask your customers to input an API key or other information, they may have input the wrong values.",[19,46950,46951],{},[478,46952,46953],{},"Solutions:",[72,46955,46956,46959,46962,46965],{},[46,46957,46958],{},"Double check that your app still has access to the API provider.",[46,46960,46961],{},"Ensure that your customers are entering the correctly values during the authorization flow.",[46,46963,46964],{},"After doing the above, recreate the connection to refresh the authentication",[46,46966,46967],{},"If the issue persists for specific endpoints, contact Unified.to support for assistance.",[35,46969,46971],{"id":46970},"permissions-403","Permissions (403)",[19,46973,46974,46975,634],{},"A 403 error is likely indicative that one or more data objects is not working as expected, usually due to misconfigured ",[1614,46976,33719],{"href":9872,"rel":46977},[1618],[19,46979,46980],{},[478,46981,46940],{},[72,46983,46984],{},[46,46985,46986,46987],{},"Mismatch between the scopes that the provider expects and what Unified.to is requesting. This can happen when:\n",[72,46988,46989,46992],{},[46,46990,46991],{},"Scopes have been changed or disabled on the provider's end i.e. in your developer account, or",[46,46993,46994,46995,46999,47000,634],{},"The proper scopes are not being requested when setting up the ",[1614,46996,46998],{"href":25574,"rel":46997},[1618],"Authorization embedded component ","or when generating an ",[1614,47001,47004],{"href":47002,"rel":47003},"https://docs.unified.to/unified/integration/Create_connection_indirectly",[1618],"authorization URL",[19,47006,47007],{},[478,47008,46953],{},[43,47010,47011,47028],{},[46,47012,47013,47014],{},"Double check your scope settings in your developer account\n",[43,47015,47016,47019,47022,47025],{},[46,47017,47018],{},"Log into your developer account for the API you're trying to access.",[46,47020,47021],{},"Navigate to the settings page where your app's authorization options are found.",[46,47023,47024],{},"Ensure that all necessary scopes are enabled (see note below on different integrations and how they handle scopes)",[46,47026,47027],{},"Make a note of the scopes that are enabled.",[46,47029,47030],{},"Double check your scope settings on Unified.to",[19,47032,47033],{},"If you are using our embedded components to create connections, you'll need to ensure that the scopes on Unified.to match the ones you enabled in the API provider.",[43,47035,47036,47042,47047,47050,47055],{},[46,47037,9926,47038,9903],{},[1614,47039,47041],{"href":17256,"rel":47040},[1618],"Embedded components",[46,47043,9757,47044],{},[478,47045,47046],{},"Permission Scopes",[46,47048,47049],{},"Select the scopes that match the scopes you enabled in the developer account (see note below on mappings)",[46,47051,47052,47053,45194],{},"(Optional, only if you are using webhooks) Select the ",[478,47054,18788],{},[46,47056,47057],{},"If the issue still persists, contact Unified.to support for assistance",[19,47059,47060,47061,47063],{},"If you are generating an auth URL to redirect your customers to our auth flow, include ",[109,47062,33719],{}," as a query parameter and list all the Unified scopes you need. Behind the scenes, Unified.to will map the Unified scopes you pass to the scopes on the API provider's end (see note below on mappings). For example:",[102,47065,47067],{"className":9951,"code":47066,"language":9953,"meta":107,"style":107},"https://api.unified.to/unified/integration/auth/\n{WORKSPACE_ID}/{INTEGRATION e.g. hubspot}?redirect=true\n&scopes=webhook,{YOUR_SCOPES e.g. crm_deal_read, crm_event_read}\n",[109,47068,47069,47078,47106],{"__ignoreMap":107},[112,47070,47071,47073,47075],{"class":114,"line":115},[112,47072,33005],{"class":118},[112,47074,171],{"class":236},[112,47076,47077],{"class":578},"//api.unified.to/unified/integration/auth/\n",[112,47079,47080,47082,47084,47087,47089,47091,47094,47097,47099,47102,47104],{"class":114,"line":126},[112,47081,17245],{"class":236},[112,47083,17203],{"class":129},[112,47085,47086],{"class":236},"}",[112,47088,12874],{"class":229},[112,47090,17245],{"class":236},[112,47092,47093],{"class":129},"INTEGRATION",[112,47095,47096],{"class":236}," e.g. hubspot}",[112,47098,4711],{"class":229},[112,47100,47101],{"class":236},"redirect",[112,47103,335],{"class":229},[112,47105,4144],{"class":129},[112,47107,47108,47111,47113,47115],{"class":114,"line":135},[112,47109,47110],{"class":229},"&",[112,47112,33719],{"class":236},[112,47114,335],{"class":229},[112,47116,47117],{"class":236},"webhook,{YOUR_SCOPES e.g. crm_deal_read, crm_event_read}\n",[19,47119,47120,2251,47122],{},[478,47121,18117],{},[1614,47123,47125],{"href":47002,"rel":47124},[1618],"Create an authorization URL",[19,47127,47128],{},"After addressing these issues, re-create the connection and/or webhook and then try again.",[19,47130,47131],{},[478,47132,47133],{},"A note on mappings:",[19,47135,47136,47137,37871,47140,47143,47144,47146],{},"A mapping of the Unified scopes to the API provider (i.e. integration's) scopes can be found on the integration details page under the ",[478,47138,47139],{},"OAuth 2 Credentials tab",[1614,47141,17258],{"href":25538,"rel":47142},[1618]," are the mappings fo",[478,47145,24031],{}," HubSpot scopes.",[19,47148,47149],{},[478,47150,47151],{},"A note on integration-specific scopes:",[19,47153,47154],{},"Different integrations may handle scopes in different ways - sometimes you can request a subset of the scopes enabled in the developer account, other times you must request all the scopes that have been enabled, and in the case of Hubspot, scopes are divided into Required and Optional scopes. For these cases, we have written how-to guides on generating OAuth credentials and configuring scopes. Please consult the Unified.to docs for more information about these integrations.",[35,47156,47158],{"id":47157},"not-found-404","Not found (404)",[19,47160,47161,47163],{},[478,47162,12467],{}," For Enrichment category integrations, 404 errors are treated as successful responses. They indicate that no data was found for the provided input, not that the connection is broken.",[19,47165,47166],{},[478,47167,47168],{},"Solution:",[72,47170,47171],{},[46,47172,47173],{},"Verify that the input data (e.g., email, company name) is correct.",[35,47175,47177],{"id":47176},"rate-limiting-429","Rate limiting (429)",[19,47179,47180],{},"429 errors are treated as successful responses by Unified.to as they indicate the connection is active but temporarily limited.",[19,47182,47183],{},[478,47184,47185],{},"Possible cause:",[72,47187,47188],{},[46,47189,47190],{},"Exceeding the API rate limits of the third-party service",[19,47192,47193],{},[478,47194,46953],{},[72,47196,47197,47204,47207],{},[46,47198,47199,47200,47203],{},"(Recommended) Use ",[1614,47201,31481],{"href":39839,"rel":47202},[1618]," to read data and Unified.to will take care of rate limiting for you.",[46,47205,47206],{},"Implement request throttling in your application.",[46,47208,47209],{},"Contact the third-party service to request increased rate limits.",[35,47211,47213],{"id":47212},"server-errors-500-series-eg-502-503-etc","Server errors (500 series e.g. 502, 503, etc)",[19,47215,47216],{},"500 series errors are often treated as successful responses by Unified.to as they usually indicate temporary issues with the third-party service. In cases where the issue is on our end, however, we will attempt to make that clear in the error message.",[19,47218,47219],{},[478,47220,46940],{},[72,47222,47223,47226],{},[46,47224,47225],{},"Temporary issues with the third-party service",[46,47227,47228],{},"Bugs",[19,47230,47231],{},[478,47232,46953],{},[72,47234,47235,47238,47241],{},[46,47236,47237],{},"Check the status page of the third-party service for any ongoing issues.",[46,47239,47240],{},"Retry the request after a short delay.",[46,47242,47243],{},"If the issue still persists or if you've discovered a bug, contact Unified.to support for assistance. Thank you!",[35,47245,47247],{"id":47246},"not-implemented-501","Not implemented (501)",[19,47249,47250],{},"501 errors are treated as successful responses by Unified.to. They indicate that a specific functionality is not implemented for the integration, not that the connection is broken.",[19,47252,47253],{},[478,47254,47255],{},"Suggestion actions:",[72,47257,47258,47261],{},[46,47259,47260],{},"Check the Unified.to documentation for the specific integration to understand its supported features.",[46,47262,47263],{},"If you believe the functionality should be supported, contact Unified.to support and we'd be happy to look into it.",[67,47265,47267],{"id":47266},"monitor-and-receive-updates-about-your-connections","Monitor and receive updates about your connections",[19,47269,47270],{},"To stay informed about changes to your connections:",[43,47272,47273,47284,47290,47323],{},[46,47274,9735,47275,2251,47278,634],{},[478,47276,47277],{},"Settings >",[1614,47279,47281],{"href":10109,"rel":47280},[1618],[478,47282,47283],{},"Workspace",[46,47285,25422,47286,47289],{},[478,47287,47288],{},"Notifications webhook URL",", enter the URL where you want to receive notifications (this should be an endpoint on your server that can receive POST requests).",[46,47291,25422,47292,47295,47296],{},[478,47293,47294],{},"Notifications webhook events",", select events related to connections:\n",[72,47297,47298,47303,47308,47313,47318],{},[46,47299,47300],{},[109,47301,47302],{},"CONNECTION_HEALTHY",[46,47304,47305],{},[109,47306,47307],{},"CONNECTION_UNHEALTHY",[46,47309,47310],{},[109,47311,47312],{},"CONNECTION_CREATED",[46,47314,47315],{},[109,47316,47317],{},"CONNECTION_UPDATED",[46,47319,47320],{},[109,47321,47322],{},"CONNECTION_DELETED",[46,47324,47325],{},"Implement a handler for these events in your app to monitor connection health proactively.",[67,47327,10173],{"id":10172},[72,47329,47330,47337],{},[46,47331,1765,47332,47336],{},[1614,47333,1770],{"href":47334,"rel":47335},"https://discord.gg/2nsAPmbx",[1618]," for support and updates.",[46,47338,47339,47340,47344],{},"If issues persist, ",[1614,47341,47343],{"href":11505,"rel":47342},[1618],"contact our support team"," for further assistance.",[19,47346,47347],{},"Remember, connection health is dynamic and can change with each API call. Not all errors indicate a broken connection, and some error types are treated as successful responses in certain contexts.",[1558,47349,47350],{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":47352},[47353,47354,47355,47356,47357,47361,47369,47370],{"id":13633,"depth":126,"text":13634},{"id":46725,"depth":126,"text":46726},{"id":46760,"depth":126,"text":46761},{"id":46796,"depth":126,"text":46757},{"id":46859,"depth":126,"text":46860,"children":47358},[47359,47360],{"id":46866,"depth":135,"text":46867},{"id":46886,"depth":135,"text":46887},{"id":46927,"depth":126,"text":46928,"children":47362},[47363,47364,47365,47366,47367,47368],{"id":46931,"depth":135,"text":46932},{"id":46970,"depth":135,"text":46971},{"id":47157,"depth":135,"text":47158},{"id":47176,"depth":135,"text":47177},{"id":47212,"depth":135,"text":47213},{"id":47246,"depth":135,"text":47247},{"id":47266,"depth":126,"text":47267},{"id":10172,"depth":126,"text":10173},"Connections allow your application to securely access data from third-party API platforms. They serve as links between your Unified.to workspace, your...",{"img":47373,"date":47374,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_troubleshoot_unhealthy_connections-icon.svg","2024-09-25T00:00:00.000Z","/guides/how_to_troubleshoot_unhealthy_connections",{"title":10169,"description":47371},"guides/how_to_troubleshoot_unhealthy_connections","Fg6bUBLAH22dKg7UCoyAnsfKug0osUO3Ugy77TsQ4Hk",{"id":47380,"title":31471,"body":47381,"description":47771,"extension":1576,"meta":47772,"navigation":271,"path":47774,"seo":47775,"stem":47776,"__hash__":47777},"guides/guides/how_to_troubleshoot_unhealthy_webhooks.md",{"type":9,"value":47382,"toc":47750},[47383,47386,47388,47392,47395,47397,47399,47416,47420,47423,47427,47445,47447,47480,47483,47494,47498,47502,47514,47518,47521,47524,47532,47536,47543,47630,47634,47637,47641,47644,47647,47651,47654,47657,47661,47664,47666,47670,47673,47679,47682,47686,47689,47693,47696,47701,47720,47725,47728,47730,47747],[12,47384,31471],{"id":47385},"how-to-troubleshoot-unhealthy-webhooks",[16,47387],{},[19,47389,47390],{},[22,47391,31460],{},[19,47393,47394],{},"Webhooks are a powerful tool for getting real-time notifications about changes to the data you care about. When something goes wrong, however, we will mark those webhooks as unhealthy. This guide explains how to diagnose and troubleshoot unhealthy webhooks at Unified.to.",[67,47396,13634],{"id":13633},[19,47398,44764],{},[72,47400,47401,47411],{},[46,47402,47403,11338,47406],{},[1614,47404,31764],{"href":31479,"rel":47405},[1618],[1614,47407,47410],{"href":47408,"rel":47409},"https://docs.unified.to/guides/understanding_virtual_webhooks#understanding-virtual-webhooks",[1618],"virtual webhooks",[46,47412,47413],{},[1614,47414,25481],{"href":9872,"rel":47415},[1618],[67,47417,47419],{"id":47418},"diagnose-the-webhook","Diagnose the webhook",[19,47421,47422],{},"The first place to look for debugging information is in the API call logs.",[35,47424,47426],{"id":47425},"_1-check-the-webhook-status","1. Check the webhook status",[43,47428,47429,47435,47440],{},[46,47430,11740,47431,634],{},[1614,47432,47434],{"href":11523,"rel":47433},[1618],"Unified.to account",[46,47436,9735,47437,634],{},[1614,47438,31764],{"href":17157,"rel":47439},[1618],[46,47441,47442,47443,634],{},"Make note of the unhealthy webhook and its ",[478,47444,480],{},[35,47446,46887],{"id":46886},[43,47448,47449,47456,47459,47465],{},[46,47450,11822,47451,634],{},[1614,47452,47454],{"href":46829,"rel":47453},[1618],[478,47455,46833],{},[46,47457,47458],{},"Filter by the connection ID of the webhook in question. You should see a list of API calls attempted by the webhook (note: we only store logs from the past 60 days).",[46,47460,47461,47462,47464],{},"Click on the latest log entry that threw an error - the ",[478,47463,11487],{}," column will display an error code.",[46,47466,47467,47468,47470,47471,47473,47474,47476],{},"Details about the API call will be shown. The ",[478,47469,1882],{}," field will detail the reason the webhook failed and the ",[478,47472,11938],{}," field will show the specific error code itself. For example:",[17180,47475],{},[1603,47477],{"alt":47478,"src":47479},"Screenshot_2024-09-05_at_1.33.44_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_troubleshoot_unhealthy_webhooks-0.png",[19,47481,47482],{},"You can also use the Unified API to retrieve a list of your webhooks and API call logs.",[19,47484,47485,2251,47487,1046,47491],{},[478,47486,18117],{},[1614,47488,47490],{"href":31876,"rel":47489},[1618],"List all webhooks",[1614,47492,46924],{"href":12721,"rel":47493},[1618],[67,47495,47497],{"id":47496},"troubleshooting-webhook-error-codes","Troubleshooting webhook error codes",[35,47499,47501],{"id":47500},"bad-request-400-errors","Bad request (400) errors",[19,47503,47504,47505,47509,47510,47513],{},"These errors indicate that something is wrong with the request - in this case, it is likely not a scope or authentication issue but a problem with the integration itself. Please ",[1614,47506,47508],{"href":11505,"rel":47507},[1618],"reach out to us"," or let us know in our ",[1614,47511,12317],{"href":47334,"rel":47512},[1618]," server. Thank you!",[35,47515,47517],{"id":47516},"authentication-401-and-permission-403-errors","Authentication (401) and permission (403) errors",[19,47519,47520],{},"A 401 error may indicate that the connection's auth credentials were entered incorrectly, whether it be the API token, a secret, or another value depending on the integration.",[19,47522,47523],{},"A 403 error is often indicative of scope mismatches with the API provider, with Unified.to, or both.",[19,47525,47526,47527],{},"Both of these errors are indicative of an issue with the connection itself, rather than the webhook. Please see: ",[1614,47528,47531],{"href":47529,"rel":47530},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_connections#troubleshooting-the-error-codes",[1618],"How to troubleshoot unhealthy connections ",[67,47533,47535],{"id":47534},"subscribe-to-the-notifications-webhook-to-be-alerted-when-your-webhooks-fail","Subscribe to the notifications webhook to be alerted when your webhooks fail",[19,47537,47538,47539,47542],{},"To learn about any webhook errors as soon as they occur, we recommend that you subscribe to our ",[478,47540,47541],{},"Notifications webhook"," to get real-time updates about your webhooks' statuses.",[43,47544,47545,47556,47619,47627],{},[46,47546,9735,47547,31757,47549,47554],{},[478,47548,25570],{},[1614,47550,47552],{"href":10109,"rel":47551},[1618],[478,47553,47283],{},[478,47555,634],{},[46,47557,25422,47558,47560,47561],{},[478,47559,47288],{},", enter the URL of the endpoint where you would like to receive notifications.",[43,47562,47563],{},[46,47564,47565,47566],{},"The payload that will be sent to this endpoint contains:",[102,47567,47569],{"className":9951,"code":47568,"language":9953,"meta":107,"style":107},"id: string // the id of the object or the integration's type\nnonce: string // random string\nsig: string // base64( hmac-sha1( id + nonce + event, workspace.secret ) )\nsig256: string // base64( hmac-sha256( id + nonce + event, workspace.secret ) )\nevent: enum //the event that was triggered\n",[109,47570,47571,47581,47589,47598,47608],{"__ignoreMap":107},[112,47572,47573,47575,47578],{"class":114,"line":115},[112,47574,2442],{"class":118},[112,47576,47577],{"class":236},": string ",[112,47579,47580],{"class":578},"// the id of the object or the integration's type\n",[112,47582,47583,47585,47587],{"class":114,"line":126},[112,47584,18793],{"class":118},[112,47586,47577],{"class":236},[112,47588,15020],{"class":578},[112,47590,47591,47593,47595],{"class":114,"line":135},[112,47592,18798],{"class":118},[112,47594,47577],{"class":236},[112,47596,47597],{"class":578},"// base64( hmac-sha1( id + nonce + event, workspace.secret ) )\n",[112,47599,47600,47603,47605],{"class":114,"line":147},[112,47601,47602],{"class":118},"sig256",[112,47604,47577],{"class":236},[112,47606,47607],{"class":578},"// base64( hmac-sha256( id + nonce + event, workspace.secret ) )\n",[112,47609,47610,47613,47616],{"class":114,"line":202},[112,47611,47612],{"class":118},"event",[112,47614,47615],{"class":236},": enum ",[112,47617,47618],{"class":578},"//the event that was triggered\n",[46,47620,25422,47621,47623,47624],{},[478,47622,47294],{},", select the events you want to be alerted to e.g. ",[109,47625,47626],{},"WEBHOOK_UNHEALTHY",[46,47628,47629],{},"On your server, handle incoming notifications as you see fit e.g. set up logging, send a message to the engineering team, post on Slack or Discord, etc.",[67,47631,47633],{"id":47632},"understanding-why-webhooks-fail","Understanding why webhooks fail",[19,47635,47636],{},"This section will go over why webhooks fail to provide a deeper understanding of how our webhooks work.",[35,47638,47640],{"id":47639},"failed-to-subscribe","Failed to subscribe",[19,47642,47643],{},"Failing to subscribe happens during webhook creation and can be due to multiple reasons: the integration isn't available, insufficient permissions (i.e. scopes mismatch), or bugs.",[19,47645,47646],{},"Note: This only applies to native webhooks.",[35,47648,47650],{"id":47649},"failed-to-refresh-token","Failed to refresh token",[19,47652,47653],{},"Failing to refresh the auth token happens when we attempt to communicate with the API provider unsuccessfully. This happens when the API provider only sends us partial data about new events (e.g. the IDs of the data) and we need to use a connection to retrieve the rest of the data. In this case, it is likely an error with the connection itself.",[19,47655,47656],{},"Double-check that the auth credentials for the connection are correct, that the scopes are set correctly (i.e. they haven't been revoked), and then recreate both the connection and its associated webhook.",[35,47658,47660],{"id":47659},"failed-to-read","Failed to read",[19,47662,47663],{},"Failing to read happens when we attempt to retrieve new data from the API provider and are prevented from doing so, whether due to configuration errors (i.e. 401 or 403 errors) or problems with the integration itself.",[19,47665,47656],{},[35,47667,47669],{"id":47668},"failed-to-dispatch-data","Failed to dispatch data",[19,47671,47672],{},"Failing to dispatch data happens when we attempt to send webhook data to your server but the server does not respond or responds with an error.",[19,47674,47675,47676,47678],{},"Make sure your webhook URL is configured correctly when creating the webhook. Respond with a ",[109,47677,18948],{}," status when your endpoint successfully receives and processes the data. Otherwise, we will keep trying to POST to your server before marking the webhook as unhealthy (after approximately 2 weeks).",[19,47680,47681],{},"After checking the above, recreate the webhook and try again.",[35,47683,47685],{"id":47684},"failed-to-process-data","Failed to process data",[19,47687,47688],{},"Failing to process data indicates a problem with either the reading or dispatching steps. Refer to the troubleshooting steps above and then recreate the webhook and try again.",[35,47690,47692],{"id":47691},"a-note-on-our-webhook-retry-mechanism","A note on our webhook retry mechanism",[19,47694,47695],{},"At Unified.to, we've implemented a robust retry mechanism to ensure reliable webhook delivery. Here's how it works.",[19,47697,47698],{},[478,47699,47700],{},"When your webhook endpoint is unavailable",[43,47702,47703,47706],{},[46,47704,47705],{},"If your endpoint is unavailable or returns an error, we'll retry up to 3 times immediately, with a 1-second delay between attempts.",[46,47707,47708,47709],{},"If the error persists, we switch to a Fibonacci backoff strategy:\n",[72,47710,47711,47714,47717],{},[46,47712,47713],{},"Initial delay: 1 minute",[46,47715,47716],{},"Subsequent delays: 1 minute, 2 minutes, 3 minutes, 5 minutes, 8 minutes, etc.",[46,47718,47719],{},"This continues for several days and up to 2 weeks, maximizing the chance of successful delivery.",[19,47721,47722],{},[478,47723,47724],{},"When the API provider is unavailable",[19,47726,47727],{},"If we can't reach the API provider or have hit their rate limits, we will back off and retry based off of a Fibonacci delay sequence (outlined above), starting with 1 minute.",[67,47729,25945],{"id":25944},[72,47731,47732,47737,47742],{},[46,47733,47734],{},[1614,47735,31448],{"href":31469,"rel":47736},[1618],[46,47738,47739],{},[1614,47740,10169],{"href":10167,"rel":47741},[1618],[46,47743,47744],{},[1614,47745,31822],{"href":31820,"rel":47746},[1618],[1558,47748,47749],{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":47751},[47752,47753,47757,47761,47762,47770],{"id":13633,"depth":126,"text":13634},{"id":47418,"depth":126,"text":47419,"children":47754},[47755,47756],{"id":47425,"depth":135,"text":47426},{"id":46886,"depth":135,"text":46887},{"id":47496,"depth":126,"text":47497,"children":47758},[47759,47760],{"id":47500,"depth":135,"text":47501},{"id":47516,"depth":135,"text":47517},{"id":47534,"depth":126,"text":47535},{"id":47632,"depth":126,"text":47633,"children":47763},[47764,47765,47766,47767,47768,47769],{"id":47639,"depth":135,"text":47640},{"id":47649,"depth":135,"text":47650},{"id":47659,"depth":135,"text":47660},{"id":47668,"depth":135,"text":47669},{"id":47684,"depth":135,"text":47685},{"id":47691,"depth":135,"text":47692},{"id":25944,"depth":126,"text":25945},"Webhooks are a powerful tool for getting real-time notifications about changes to the data you care about. When something goes wrong, however, we will mark...",{"img":47773,"date":32241,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_troubleshoot_unhealthy_webhooks-icon.png","/guides/how_to_troubleshoot_unhealthy_webhooks",{"title":31471,"description":47771},"guides/how_to_troubleshoot_unhealthy_webhooks","qKiHz8snmQPvNHbBNVxTVn7JAgb0qx7Dyzrx7xzboF0",{"id":47779,"title":47780,"body":47781,"description":47915,"extension":1576,"meta":47916,"navigation":271,"path":47919,"seo":47920,"stem":47921,"__hash__":47922},"guides/guides/how_to_use_scim_with_the_unified_api.md","How to use SCIM with the Unified API",{"type":9,"value":47782,"toc":47907},[47783,47786,47788,47793,47796,47799,47801,47809,47813,47816,47819,47835,47838,47842,47845,47865,47868,47872,47884,47887,47889,47905],[12,47784,47780],{"id":47785},"how-to-use-scim-with-the-unified-api",[16,47787],{},[19,47789,47790],{},[22,47791,47792],{},"October 3, 2024",[19,47794,47795],{},"This guide explains how to use System for Cross-domain Identity Management (SCIM) with Unified.to. SCIM is a standardized API for managing user identities across different systems, enabling seamless identity management across multiple integrations.",[19,47797,47798],{},"For developers already using SCIM, Unified.to's support means you can leverage your existing SCIM knowledge and implementations across a wider range of integrations.",[67,47800,13634],{"id":13633},[19,47802,47803,47804,634],{},"This guide assumes you already have a basic understanding of SCIM and its purpose in identity management. You can read more about it in the ",[1614,47805,47808],{"href":47806,"rel":47807},"https://scim.cloud/",[1618],"official specification",[67,47810,47812],{"id":47811},"using-scim-with-unifiedto","Using SCIM with Unified.to",[19,47814,47815],{},"Unified.to provides SCIM-compliant endpoints for managing user identities. These endpoints return data in the standard SCIM format.",[19,47817,47818],{},"View the API references for:",[72,47820,47821,47828],{},[46,47822,47823],{},[1614,47824,47827],{"href":47825,"rel":47826},"https://docs.unified.to/scim/users/model",[1618],"Users",[46,47829,47830],{},[1614,47831,47834],{"href":47832,"rel":47833},"https://docs.unified.to/scim/groups/model",[1618],"Groups",[19,47836,47837],{},"If you've already implemented SCIM in your application, you can simply point it to our SCIM endpoints.",[35,47839,47841],{"id":47840},"leverage-scim-extensions","Leverage SCIM extensions",[19,47843,47844],{},"In addition to the core SCIM schema, Unified.to supports the following extensions:",[102,47846,47848],{"className":174,"code":47847,"language":176,"meta":177,"style":107},"'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'\n'urn:ietf:params:scim:schemas:extension:lattice:attributes:1.0:User'\n'urn:ietf:params:scim:schemas:extension:peakon:2.0:User'\n",[109,47849,47850,47855,47860],{"__ignoreMap":107},[112,47851,47852],{"class":114,"line":115},[112,47853,47854],{},"'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'\n",[112,47856,47857],{"class":114,"line":126},[112,47858,47859],{},"'urn:ietf:params:scim:schemas:extension:lattice:attributes:1.0:User'\n",[112,47861,47862],{"class":114,"line":135},[112,47863,47864],{},"'urn:ietf:params:scim:schemas:extension:peakon:2.0:User'\n",[19,47866,47867],{},"These extensions allow for more detailed user attributes specific to certain platforms.",[67,47869,47871],{"id":47870},"use-scim-for-any-integration-that-supports-the-employee-object","Use SCIM for any integration that supports the Employee object",[19,47873,47874,47875,47881,47883],{},"One of the key advantages of using SCIM with Unified.to is that we have virtualized its behaviour in order to support a vast number of integrations. This means you can use SCIM with any integration that supports the Employee object (i.e. all ",[1614,47876,47878],{"href":12914,"rel":47877},[1618],[478,47879,47880],{},"HR integrations",[478,47882,610],{},", regardless of whether the underlying API natively supports SCIM.",[19,47885,47886],{},"By using Unified.to, you can expand your SCIM-compatible integrations from just a handful to over 100 different service providers.",[67,47888,25945],{"id":25944},[72,47890,47891,47898],{},[46,47892,47893],{},[1614,47894,47897],{"href":47895,"rel":47896},"https://docs.unified.to/scim/overview",[1618],"SCIM API overview",[46,47899,47900],{},[1614,47901,47904],{"href":47902,"rel":47903},"https://datatracker.ietf.org/doc/html/rfc7644",[1618],"Official SCIM specifications",[1558,47906,43129],{},{"title":107,"searchDepth":126,"depth":126,"links":47908},[47909,47910,47913,47914],{"id":13633,"depth":126,"text":13634},{"id":47811,"depth":126,"text":47812,"children":47911},[47912],{"id":47840,"depth":135,"text":47841},{"id":47870,"depth":126,"text":47871},{"id":25944,"depth":126,"text":25945},"This guide explains how to use System for Cross-domain Identity Management (SCIM) with Unified.to. SCIM is a standardized API for managing user identities...",{"img":47917,"date":47918,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_scim_with_the_unified_api-icon.jpg","2024-10-03T00:00:00.000Z","/guides/how_to_use_scim_with_the_unified_api",{"title":47780,"description":47915},"guides/how_to_use_scim_with_the_unified_api","aHAm8HiTTD4xS48ryu418RLr0Ojk_dWb0HZL8c7Zjsc",{"id":47924,"title":47925,"body":47926,"description":47940,"extension":1576,"meta":48797,"navigation":271,"path":48800,"seo":48801,"stem":48802,"__hash__":48803},"guides/guides/how_to_use_the_passthrough_api.md","How to use the Passthrough API",{"type":9,"value":47927,"toc":48783},[47928,47931,47933,47938,47941,47943,47946,47954,47958,47961,47970,47974,48143,48151,48357,48361,48365,48368,48427,48436,48440,48443,48549,48558,48562,48565,48760,48769,48771,48780],[12,47929,47925],{"id":47930},"how-to-use-the-passthrough-api",[16,47932],{},[19,47934,47935],{},[22,47936,47937],{},"November 25, 2024",[19,47939,47940],{},"This guide shows you how to make requests using Unified.to's Passthrough API with practical examples.",[67,47942,13634],{"id":13633},[19,47944,47945],{},"You should have:",[72,47947,47948,47951],{},[46,47949,47950],{},"At least one active connection for an integration",[46,47952,47953],{},"The connection ID for the integration you want to access",[67,47955,47957],{"id":47956},"making-passthrough-requests","Making Passthrough requests",[19,47959,47960],{},"The following examples demonstrate calls to mock endpoints with the Passthrough API.",[19,47962,47963,47965,47966,47969],{},[478,47964,35677],{}," There is only one reserved URL parameter, and that is ",[109,47967,47968],{},"__domain",". Use it to override the default API URL for that integration.",[35,47971,47973],{"id":47972},"using-the-rest-api-directly","Using the REST API directly",[102,47975,47977],{"className":9951,"code":47976,"language":9953,"meta":107,"style":107},"// GET request example\nconst response = await fetch('https://api.unified.to/passthrough/{connection_id}/v2/customers', {\n  method: 'GET',\n  headers: {\n    'Authorization': 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application/json'\n  }\n});\n\n// POST request example\nconst response = await fetch('https://api.unified.to/passthrough/{connection_id}/v2/customers', {\n  method: 'POST',\n  headers: {\n    'Authorization': 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    name: 'John Doe',\n    email: 'john@example.com'\n  })\n});\n",[109,47978,47979,47984,48003,48011,48015,48026,48035,48039,48043,48047,48052,48070,48078,48082,48092,48100,48104,48117,48126,48134,48139],{"__ignoreMap":107},[112,47980,47981],{"class":114,"line":115},[112,47982,47983],{"class":578},"// GET request example\n",[112,47985,47986,47988,47990,47992,47994,47996,47998,48001],{"class":114,"line":126},[112,47987,277],{"class":229},[112,47989,17600],{"class":129},[112,47991,354],{"class":229},[112,47993,539],{"class":229},[112,47995,17607],{"class":118},[112,47997,456],{"class":236},[112,47999,48000],{"class":122},"'https://api.unified.to/passthrough/{connection_id}/v2/customers'",[112,48002,27661],{"class":236},[112,48004,48005,48007,48009],{"class":114,"line":135},[112,48006,14039],{"class":236},[112,48008,14042],{"class":122},[112,48010,288],{"class":236},[112,48012,48013],{"class":114,"line":147},[112,48014,14059],{"class":236},[112,48016,48017,48019,48021,48024],{"class":114,"line":202},[112,48018,38906],{"class":122},[112,48020,2335],{"class":236},[112,48022,48023],{"class":122},"'Bearer YOUR_API_KEY'",[112,48025,288],{"class":236},[112,48027,48028,48031,48033],{"class":114,"line":208},[112,48029,48030],{"class":122},"    'Content-Type'",[112,48032,2335],{"class":236},[112,48034,18578],{"class":122},[112,48036,48037],{"class":114,"line":291},[112,48038,1476],{"class":236},[112,48040,48041],{"class":114,"line":299},[112,48042,384],{"class":236},[112,48044,48045],{"class":114,"line":307},[112,48046,272],{"emptyLinePlaceholder":271},[112,48048,48049],{"class":114,"line":315},[112,48050,48051],{"class":578},"// POST request example\n",[112,48053,48054,48056,48058,48060,48062,48064,48066,48068],{"class":114,"line":323},[112,48055,277],{"class":229},[112,48057,17600],{"class":129},[112,48059,354],{"class":229},[112,48061,539],{"class":229},[112,48063,17607],{"class":118},[112,48065,456],{"class":236},[112,48067,48000],{"class":122},[112,48069,27661],{"class":236},[112,48071,48072,48074,48076],{"class":114,"line":329},[112,48073,14039],{"class":236},[112,48075,18547],{"class":122},[112,48077,288],{"class":236},[112,48079,48080],{"class":114,"line":341},[112,48081,14059],{"class":236},[112,48083,48084,48086,48088,48090],{"class":114,"line":346},[112,48085,38906],{"class":122},[112,48087,2335],{"class":236},[112,48089,48023],{"class":122},[112,48091,288],{"class":236},[112,48093,48094,48096,48098],{"class":114,"line":366},[112,48095,48030],{"class":122},[112,48097,2335],{"class":236},[112,48099,18578],{"class":122},[112,48101,48102],{"class":114,"line":381},[112,48103,9512],{"class":236},[112,48105,48106,48109,48111,48113,48115],{"class":114,"line":387},[112,48107,48108],{"class":236},"  body: ",[112,48110,13765],{"class":129},[112,48112,634],{"class":236},[112,48114,13770],{"class":118},[112,48116,363],{"class":236},[112,48118,48119,48121,48124],{"class":114,"line":392},[112,48120,18067],{"class":236},[112,48122,48123],{"class":122},"'John Doe'",[112,48125,288],{"class":236},[112,48127,48128,48131],{"class":114,"line":409},[112,48129,48130],{"class":236},"    email: ",[112,48132,48133],{"class":122},"'john@example.com'\n",[112,48135,48136],{"class":114,"line":422},[112,48137,48138],{"class":236},"  })\n",[112,48140,48141],{"class":114,"line":435},[112,48142,384],{"class":236},[35,48144,48146,48147,48150],{"id":48145},"using-the-unifiedto-sdk","Using the ",[1614,48148,1640],{"href":1638,"rel":48149},[1618]," SDK",[102,48152,48154],{"className":9951,"code":48153,"language":9953,"meta":107,"style":107},"// GET request\nconst response = await unified.passthrough.listPassthroughs({\n  connectionId: 'YOUR_CONNECTION_ID',\n  path: '/v2/customers'\n});\n\n// POST request\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: 'YOUR_CONNECTION_ID',\n  path: '/v2/customers',\n  data: {\n    name: 'John Doe',\n    email: 'john@example.com'\n  }\n});\n\n// With custom headers\nconst response = await unified.passthrough.listPassthroughs(\n  {\n    connectionId: 'YOUR_CONNECTION_ID',\n    path: '/v2/customers'\n  },\n  {\n    fetchOptions: {\n      headers: {\n        'x-api-version': '2023-06-01'\n      }\n    }\n  }\n);\n",[109,48155,48156,48161,48179,48189,48197,48201,48205,48210,48227,48235,48244,48248,48256,48262,48266,48270,48274,48279,48295,48299,48307,48314,48318,48322,48327,48331,48341,48345,48349,48353],{"__ignoreMap":107},[112,48157,48158],{"class":114,"line":115},[112,48159,48160],{"class":578},"// GET request\n",[112,48162,48163,48165,48167,48169,48171,48174,48177],{"class":114,"line":126},[112,48164,277],{"class":229},[112,48166,17600],{"class":129},[112,48168,354],{"class":229},[112,48170,539],{"class":229},[112,48172,48173],{"class":236}," unified.passthrough.",[112,48175,48176],{"class":118},"listPassthroughs",[112,48178,363],{"class":236},[112,48180,48181,48184,48187],{"class":114,"line":135},[112,48182,48183],{"class":236},"  connectionId: ",[112,48185,48186],{"class":122},"'YOUR_CONNECTION_ID'",[112,48188,288],{"class":236},[112,48190,48191,48194],{"class":114,"line":147},[112,48192,48193],{"class":236},"  path: ",[112,48195,48196],{"class":122},"'/v2/customers'\n",[112,48198,48199],{"class":114,"line":202},[112,48200,384],{"class":236},[112,48202,48203],{"class":114,"line":208},[112,48204,272],{"emptyLinePlaceholder":271},[112,48206,48207],{"class":114,"line":291},[112,48208,48209],{"class":578},"// POST request\n",[112,48211,48212,48214,48216,48218,48220,48222,48225],{"class":114,"line":299},[112,48213,277],{"class":229},[112,48215,17600],{"class":129},[112,48217,354],{"class":229},[112,48219,539],{"class":229},[112,48221,48173],{"class":236},[112,48223,48224],{"class":118},"createPassthrough",[112,48226,363],{"class":236},[112,48228,48229,48231,48233],{"class":114,"line":307},[112,48230,48183],{"class":236},[112,48232,48186],{"class":122},[112,48234,288],{"class":236},[112,48236,48237,48239,48242],{"class":114,"line":315},[112,48238,48193],{"class":236},[112,48240,48241],{"class":122},"'/v2/customers'",[112,48243,288],{"class":236},[112,48245,48246],{"class":114,"line":323},[112,48247,33203],{"class":236},[112,48249,48250,48252,48254],{"class":114,"line":329},[112,48251,18067],{"class":236},[112,48253,48123],{"class":122},[112,48255,288],{"class":236},[112,48257,48258,48260],{"class":114,"line":341},[112,48259,48130],{"class":236},[112,48261,48133],{"class":122},[112,48263,48264],{"class":114,"line":346},[112,48265,1476],{"class":236},[112,48267,48268],{"class":114,"line":366},[112,48269,384],{"class":236},[112,48271,48272],{"class":114,"line":381},[112,48273,272],{"emptyLinePlaceholder":271},[112,48275,48276],{"class":114,"line":387},[112,48277,48278],{"class":578},"// With custom headers\n",[112,48280,48281,48283,48285,48287,48289,48291,48293],{"class":114,"line":392},[112,48282,277],{"class":229},[112,48284,17600],{"class":129},[112,48286,354],{"class":229},[112,48288,539],{"class":229},[112,48290,48173],{"class":236},[112,48292,48176],{"class":118},[112,48294,17610],{"class":236},[112,48296,48297],{"class":114,"line":409},[112,48298,26155],{"class":236},[112,48300,48301,48303,48305],{"class":114,"line":422},[112,48302,928],{"class":236},[112,48304,48186],{"class":122},[112,48306,288],{"class":236},[112,48308,48309,48312],{"class":114,"line":435},[112,48310,48311],{"class":236},"    path: ",[112,48313,48196],{"class":122},[112,48315,48316],{"class":114,"line":440},[112,48317,9512],{"class":236},[112,48319,48320],{"class":114,"line":4949},[112,48321,26155],{"class":236},[112,48323,48324],{"class":114,"line":4960},[112,48325,48326],{"class":236},"    fetchOptions: {\n",[112,48328,48329],{"class":114,"line":4972},[112,48330,17631],{"class":236},[112,48332,48333,48336,48338],{"class":114,"line":4984},[112,48334,48335],{"class":122},"        'x-api-version'",[112,48337,2335],{"class":236},[112,48339,48340],{"class":122},"'2023-06-01'\n",[112,48342,48343],{"class":114,"line":4992},[112,48344,17649],{"class":236},[112,48346,48347],{"class":114,"line":5000},[112,48348,3946],{"class":236},[112,48350,48351],{"class":114,"line":5008},[112,48352,1476],{"class":236},[112,48354,48355],{"class":114,"line":5016},[112,48356,464],{"class":236},[67,48358,48360],{"id":48359},"real-world-examples","Real-world examples",[35,48362,48364],{"id":48363},"example-1-fetching-hubspot-properties","Example 1: Fetching HubSpot properties",[19,48366,48367],{},"This example demonstrates how to fetch custom properties for HubSpot contacts.",[102,48369,48371],{"className":9951,"code":48370,"language":9953,"meta":107,"style":107},"const response = await unified.passthrough.listPassthroughs({\n  connectionId: HUBSPOT_CONNECTION_ID,\n  path: '/crm/v3/properties/{objectType}/batch/read'\n});\n\n// Response will contain raw HubSpot property definitions\nconsole.log(response.data);\n",[109,48372,48373,48389,48398,48405,48409,48413,48418],{"__ignoreMap":107},[112,48374,48375,48377,48379,48381,48383,48385,48387],{"class":114,"line":115},[112,48376,277],{"class":229},[112,48378,17600],{"class":129},[112,48380,354],{"class":229},[112,48382,539],{"class":229},[112,48384,48173],{"class":236},[112,48386,48176],{"class":118},[112,48388,363],{"class":236},[112,48390,48391,48393,48396],{"class":114,"line":126},[112,48392,48183],{"class":236},[112,48394,48395],{"class":129},"HUBSPOT_CONNECTION_ID",[112,48397,288],{"class":236},[112,48399,48400,48402],{"class":114,"line":135},[112,48401,48193],{"class":236},[112,48403,48404],{"class":122},"'/crm/v3/properties/{objectType}/batch/read'\n",[112,48406,48407],{"class":114,"line":147},[112,48408,384],{"class":236},[112,48410,48411],{"class":114,"line":202},[112,48412,272],{"emptyLinePlaceholder":271},[112,48414,48415],{"class":114,"line":208},[112,48416,48417],{"class":578},"// Response will contain raw HubSpot property definitions\n",[112,48419,48420,48422,48424],{"class":114,"line":291},[112,48421,26884],{"class":236},[112,48423,1512],{"class":118},[112,48425,48426],{"class":236},"(response.data);\n",[19,48428,48429,2251,48431],{},[478,48430,18117],{},[1614,48432,48435],{"href":48433,"rel":48434},"https://developers.hubspot.com/beta-docs/reference/api/crm/properties#get-%2Fcrm%2Fv3%2Fproperties%2F%7Bobjecttype%7D",[1618],"Hubspot CRM Properties",[35,48437,48439],{"id":48438},"example-2-creating-a-slack-channel","Example 2: Creating a Slack channel",[19,48441,48442],{},"This example demonstrates creating a channel in Slack.",[102,48444,48446],{"className":9951,"code":48445,"language":9953,"meta":107,"style":107},"// Create a private Slack channel\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: SLACK_CONNECTION_ID,\n  path: '/conversations.create',\n  data: {\n    name: 'project-discussion',\n    is_private: true\n  }\n});\n\n// Check the response\nif (response.data.ok) {\n  console.log('Channel created:', response.data.channel.id);\n}\n",[109,48447,48448,48453,48469,48478,48487,48491,48500,48507,48511,48515,48519,48524,48531,48545],{"__ignoreMap":107},[112,48449,48450],{"class":114,"line":115},[112,48451,48452],{"class":578},"// Create a private Slack channel\n",[112,48454,48455,48457,48459,48461,48463,48465,48467],{"class":114,"line":126},[112,48456,277],{"class":229},[112,48458,17600],{"class":129},[112,48460,354],{"class":229},[112,48462,539],{"class":229},[112,48464,48173],{"class":236},[112,48466,48224],{"class":118},[112,48468,363],{"class":236},[112,48470,48471,48473,48476],{"class":114,"line":135},[112,48472,48183],{"class":236},[112,48474,48475],{"class":129},"SLACK_CONNECTION_ID",[112,48477,288],{"class":236},[112,48479,48480,48482,48485],{"class":114,"line":147},[112,48481,48193],{"class":236},[112,48483,48484],{"class":122},"'/conversations.create'",[112,48486,288],{"class":236},[112,48488,48489],{"class":114,"line":202},[112,48490,33203],{"class":236},[112,48492,48493,48495,48498],{"class":114,"line":208},[112,48494,18067],{"class":236},[112,48496,48497],{"class":122},"'project-discussion'",[112,48499,288],{"class":236},[112,48501,48502,48505],{"class":114,"line":291},[112,48503,48504],{"class":236},"    is_private: ",[112,48506,4144],{"class":129},[112,48508,48509],{"class":114,"line":299},[112,48510,1476],{"class":236},[112,48512,48513],{"class":114,"line":307},[112,48514,384],{"class":236},[112,48516,48517],{"class":114,"line":315},[112,48518,272],{"emptyLinePlaceholder":271},[112,48520,48521],{"class":114,"line":323},[112,48522,48523],{"class":578},"// Check the response\n",[112,48525,48526,48528],{"class":114,"line":329},[112,48527,26505],{"class":229},[112,48529,48530],{"class":236}," (response.data.ok) {\n",[112,48532,48533,48535,48537,48539,48542],{"class":114,"line":341},[112,48534,1509],{"class":236},[112,48536,1512],{"class":118},[112,48538,456],{"class":236},[112,48540,48541],{"class":122},"'Channel created:'",[112,48543,48544],{"class":236},", response.data.channel.id);\n",[112,48546,48547],{"class":114,"line":346},[112,48548,584],{"class":236},[19,48550,48551,2335,48553],{},[478,48552,17920],{},[1614,48554,48557],{"href":48555,"rel":48556},"https://api.slack.com/methods/conversations.create",[1618],"conversations.create",[35,48559,48561],{"id":48560},"example-3-creating-a-salesforce-record","Example 3: Creating a Salesforce record",[19,48563,48564],{},"This example demonstrates two ways of creating a new Account record in Salesforce using their sObject API.",[102,48566,48568],{"className":9951,"code":48567,"language":9953,"meta":107,"style":107},"// Using the SDK\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: SALESFORCE_CONNECTION_ID,\n// Note: path starts with 'services/data/v62.0' as required by Salesforce\n  path: 'services/data/v62.0/sobjects/Account/',\n  data: {\n    \"Name\": \"Express Logistics and Transport\"\n  }\n});\n\n\nconst response = await fetch('https://api.unified.to/passthrough/{connection_id}/services/data/v62.0/sobjects/Account/', {\n  method: 'POST',\n  headers: {\n    'Authorization': 'Bearer YOUR_UNIFIED_API_KEY',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    \"Name\": \"Express Logistics and Transport\"\n  })\n});\n\n// The response will contain the new record ID if successful:\n// {\n//   \"id\": \"001D000000IqhSLIAZ\",\n//   \"errors\": [],\n//   \"success\": true\n// }\n",[109,48569,48570,48575,48591,48600,48605,48614,48618,48628,48632,48636,48640,48644,48663,48671,48675,48686,48694,48698,48710,48718,48722,48726,48730,48735,48740,48745,48750,48755],{"__ignoreMap":107},[112,48571,48572],{"class":114,"line":115},[112,48573,48574],{"class":578},"// Using the SDK\n",[112,48576,48577,48579,48581,48583,48585,48587,48589],{"class":114,"line":126},[112,48578,277],{"class":229},[112,48580,17600],{"class":129},[112,48582,354],{"class":229},[112,48584,539],{"class":229},[112,48586,48173],{"class":236},[112,48588,48224],{"class":118},[112,48590,363],{"class":236},[112,48592,48593,48595,48598],{"class":114,"line":135},[112,48594,48183],{"class":236},[112,48596,48597],{"class":129},"SALESFORCE_CONNECTION_ID",[112,48599,288],{"class":236},[112,48601,48602],{"class":114,"line":147},[112,48603,48604],{"class":578},"// Note: path starts with 'services/data/v62.0' as required by Salesforce\n",[112,48606,48607,48609,48612],{"class":114,"line":202},[112,48608,48193],{"class":236},[112,48610,48611],{"class":122},"'services/data/v62.0/sobjects/Account/'",[112,48613,288],{"class":236},[112,48615,48616],{"class":114,"line":208},[112,48617,33203],{"class":236},[112,48619,48620,48623,48625],{"class":114,"line":291},[112,48621,48622],{"class":122},"    \"Name\"",[112,48624,2335],{"class":236},[112,48626,48627],{"class":122},"\"Express Logistics and Transport\"\n",[112,48629,48630],{"class":114,"line":299},[112,48631,1476],{"class":236},[112,48633,48634],{"class":114,"line":307},[112,48635,384],{"class":236},[112,48637,48638],{"class":114,"line":315},[112,48639,272],{"emptyLinePlaceholder":271},[112,48641,48642],{"class":114,"line":323},[112,48643,272],{"emptyLinePlaceholder":271},[112,48645,48646,48648,48650,48652,48654,48656,48658,48661],{"class":114,"line":329},[112,48647,277],{"class":229},[112,48649,17600],{"class":129},[112,48651,354],{"class":229},[112,48653,539],{"class":229},[112,48655,17607],{"class":118},[112,48657,456],{"class":236},[112,48659,48660],{"class":122},"'https://api.unified.to/passthrough/{connection_id}/services/data/v62.0/sobjects/Account/'",[112,48662,27661],{"class":236},[112,48664,48665,48667,48669],{"class":114,"line":341},[112,48666,14039],{"class":236},[112,48668,18547],{"class":122},[112,48670,288],{"class":236},[112,48672,48673],{"class":114,"line":346},[112,48674,14059],{"class":236},[112,48676,48677,48679,48681,48684],{"class":114,"line":366},[112,48678,38906],{"class":122},[112,48680,2335],{"class":236},[112,48682,48683],{"class":122},"'Bearer YOUR_UNIFIED_API_KEY'",[112,48685,288],{"class":236},[112,48687,48688,48690,48692],{"class":114,"line":381},[112,48689,48030],{"class":122},[112,48691,2335],{"class":236},[112,48693,18578],{"class":122},[112,48695,48696],{"class":114,"line":387},[112,48697,9512],{"class":236},[112,48699,48700,48702,48704,48706,48708],{"class":114,"line":392},[112,48701,48108],{"class":236},[112,48703,13765],{"class":129},[112,48705,634],{"class":236},[112,48707,13770],{"class":118},[112,48709,363],{"class":236},[112,48711,48712,48714,48716],{"class":114,"line":409},[112,48713,48622],{"class":122},[112,48715,2335],{"class":236},[112,48717,48627],{"class":122},[112,48719,48720],{"class":114,"line":422},[112,48721,48138],{"class":236},[112,48723,48724],{"class":114,"line":435},[112,48725,384],{"class":236},[112,48727,48728],{"class":114,"line":440},[112,48729,272],{"emptyLinePlaceholder":271},[112,48731,48732],{"class":114,"line":4949},[112,48733,48734],{"class":578},"// The response will contain the new record ID if successful:\n",[112,48736,48737],{"class":114,"line":4960},[112,48738,48739],{"class":578},"// {\n",[112,48741,48742],{"class":114,"line":4972},[112,48743,48744],{"class":578},"//   \"id\": \"001D000000IqhSLIAZ\",\n",[112,48746,48747],{"class":114,"line":4984},[112,48748,48749],{"class":578},"//   \"errors\": [],\n",[112,48751,48752],{"class":114,"line":4992},[112,48753,48754],{"class":578},"//   \"success\": true\n",[112,48756,48757],{"class":114,"line":5000},[112,48758,48759],{"class":578},"// }\n",[19,48761,48762,2251,48764],{},[478,48763,18117],{},[1614,48765,48768],{"href":48766,"rel":48767},"https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_create.htm",[1618],"Create a Record",[67,48770,25945],{"id":25944},[72,48772,48773],{},[46,48774,48775],{},[1614,48776,48779],{"href":48777,"rel":48778},"https://docs.unified.to/passthrough/overview",[1618],"Passthrough API Overview",[1558,48781,48782],{},"html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":107,"searchDepth":126,"depth":126,"links":48784},[48785,48786,48791,48796],{"id":13633,"depth":126,"text":13634},{"id":47956,"depth":126,"text":47957,"children":48787},[48788,48789],{"id":47972,"depth":135,"text":47973},{"id":48145,"depth":135,"text":48790},"Using the Unified.to SDK",{"id":48359,"depth":126,"text":48360,"children":48792},[48793,48794,48795],{"id":48363,"depth":135,"text":48364},{"id":48438,"depth":135,"text":48439},{"id":48560,"depth":135,"text":48561},{"id":25944,"depth":126,"text":25945},{"img":48798,"date":48799,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_the_passthrough_api-icon.png","2024-11-25T00:00:00.000Z","/guides/how_to_use_the_passthrough_api",{"title":47925,"description":47940},"guides/how_to_use_the_passthrough_api","0jPuhAV8E1itsOm8wE_QULyZWKrRgHhCa-s3ojl-ZgI",{"id":48805,"title":48806,"body":48807,"description":51882,"extension":1576,"meta":51883,"navigation":271,"path":51886,"seo":51887,"stem":51888,"__hash__":51889},"guides/guides/how_to_use_unified_generative_ai_api_with_openai_and_claude.md","How to Use Unified.to's Generative AI API with OpenAI and Claude",{"type":9,"value":48808,"toc":51870},[48809,48812,48814,48819,48825,48828,48872,48875,48878,48923,48927,48944,48950,48959,48964,48970,48983,48989,48995,49001,49012,49018,49022,49033,49039,49048,49054,49060,49066,49072,49075,49086,49092,49103,49109,49115,49121,49124,49128,49139,49145,49149,49152,49158,49187,49196,49200,49213,49227,49231,49234,49242,49247,49253,49402,49408,49413,49416,49564,49653,49656,49797,49800,49812,49815,49828,49833,49836,49852,49855,49871,49874,49999,50001,50123,50126,50136,50139,50152,50157,50163,50330,50332,50454,50467,50472,50475,50489,50491,50505,50507,50670,50672,50794,50797,50801,50808,50816,50830,51007,51010,51018,51022,51025,51030,51033,51091,51102,51337,51346,51399,51404,51407,51584,51591,51594,51644,51662,51707,51710,51755,51765,51821,51823,51826,51852,51856,51859,51867],[12,48810,48806],{"id":48811},"how-to-use-unifiedtos-generative-ai-api-with-openai-and-claude",[16,48813],{},[19,48815,48816],{},[22,48817,48818],{},"May 29, 2024",[19,48820,48821],{},[1603,48822],{"alt":48823,"src":48824},"Unified.to_-_Unified_GenAI_API.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-0.png",[19,48826,48827],{},"This guide shows you how to get started with Unified.to's GenAI (generative AI) API, which provides a unified model and API for interacting with large language models (LLMs) from the following:",[72,48829,48830,48837,48844,48851,48858,48865],{},[46,48831,48832],{},[1614,48833,48836],{"href":48834,"rel":48835},"https://www.anthropic.com/api",[1618],"Anthropic Claude",[46,48838,48839],{},[1614,48840,48843],{"href":48841,"rel":48842},"https://www.anyscale.com/platform",[1618],"Anyscale",[46,48845,48846],{},[1614,48847,48850],{"href":48848,"rel":48849},"https://ai.google.dev/",[1618],"Google Gemini",[46,48852,48853],{},[1614,48854,48857],{"href":48855,"rel":48856},"https://console.groq.com/docs/",[1618],"Groq",[46,48859,48860],{},[1614,48861,48864],{"href":48862,"rel":48863},"https://docs.mistral.ai/api/",[1618],"Mistral AI",[46,48866,48867],{},[1614,48868,48871],{"href":48869,"rel":48870},"https://openai.com/api/",[1618],"OpenAI GPT",[19,48873,48874],{},"To illustrate its power, we will work through a sample application using your own GenAI API credentials, although Unified.to's use cases always target a SaaS company's customer accounts.",[19,48876,48877],{},"To follow the steps in this guide, you'll need the following:",[72,48879,48880,48889,48902,48905],{},[46,48881,48882,48884,48885,634],{},[478,48883,38707],{}," If you don't have one, you can sign up for our free 30-day unlimited-use ",[1614,48886,48888],{"href":12214,"rel":48887},[1618],"Tester plan",[46,48890,48891,48892,48897,48898,634],{},"Accounts for the ",[1614,48893,48896],{"href":48894,"rel":48895},"https://platform.openai.com/docs/overview",[1618],"OpenAI API"," and the ",[1614,48899,48901],{"href":48834,"rel":48900},[1618],"Anthropic Claude API",[46,48903,48904],{},"Python (preferably version 3.10 or later).",[46,48906,48907,48912,48913,48918,48919,48922],{},[1614,48908,48911],{"href":48909,"rel":48910},"https://jupyter.org/",[1618],"Jupyter Notebook"," (included with the ",[1614,48914,48917],{"href":48915,"rel":48916},"https://www.anaconda.com/download",[1618],"Anaconda Python distribution"," or easily installed with the command ",[109,48920,48921],{},"pip install notebook",". It's a great tool for experimenting with Python and exploring APIs and libraries.",[67,48924,48926],{"id":48925},"activate-the-integrations","Activate the integrations",[19,48928,48929,48930,48934,48935,48937,48938,48940,48941,48943],{},"The first step is to activate the Claude and OpenAI integrations. ",[1614,48931,48933],{"href":12214,"rel":48932},[1618],"Log in to Unified.to"," and navigate to the ",[478,48936,9700],{}," page by selecting ",[478,48939,9700],{}," → ",[478,48942,40572],{}," from the menu bar in the Unified.to dashboard:",[19,48945,48946],{},[1603,48947],{"alt":48948,"src":48949},"Initial_GenAI_integrations_page.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-1.png",[19,48951,48952,48953,15469,48956,48958],{},"Narrow down the integrations to only the generative AI ones by selecting ",[478,48954,48955],{},"GENAI",[478,48957,12940],{}," menu.",[19,48960,17167,48961,48963],{},[478,48962,48836],{}," item, which will take you to its integration page:",[19,48965,48966],{},[1603,48967],{"alt":48968,"src":48969},"Integrate_Anthropic_Claude.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-2.png",[19,48971,48972,48973,48976,48977,48979,48980,48982],{},"Activate the Claude integration by clicking the ",[478,48974,48975],{},"ACTIVATE"," button. This will return you to the ",[478,48978,9700],{}," page, where you'll see that the ",[478,48981,48836],{}," item is now marked 'active:'",[19,48984,48985],{},[1603,48986],{"alt":48987,"src":48988},"Updated_GenAI_integrations_page.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-3.png",[19,48990,48991,48992,48963],{},"Now click on the ",[478,48993,48994],{},"OpenAI",[19,48996,48997],{},[1603,48998],{"alt":48999,"src":49000},"Integrate_OpenAI.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-4.png",[19,49002,49003,49004,49006,49007,48979,49009,49011],{},"Activate the OpenAI integration by clicking the ",[478,49005,48975],{}," button. Once again, you'll return to the ",[478,49008,9700],{},[478,49010,48994],{}," item is also marked 'active:'",[19,49013,49014],{},[1603,49015],{"alt":49016,"src":49017},"Final_GenAI_integrations_page.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-5.png",[67,49019,49021],{"id":49020},"create-the-connections-and-copy-the-connection-ids","Create the connections and copy the connection IDs",[19,49023,49024,49025,48937,49027,48940,49029,49032],{},"The next step is to create connections for Claude and OpenAI. Navigate to the ",[478,49026,9933],{},[478,49028,25570],{},[478,49030,49031],{},"Embedded Authorizations"," from the menu bar:",[19,49034,49035],{},[1603,49036],{"alt":49037,"src":49038},"Embedded_authorization_page_1.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-6.png",[19,49040,49041,49042,49044,49045],{},"First, create a Claude connection by clicking the ",[478,49043,48836],{}," item in the ",[478,49046,49047],{},"End-User Preview.",[19,49049,49050,49051,49053],{},"When you arrive at the Claude authorization page, paste your Claude API key into the text field provided, then click the ",[478,49052,11853],{}," button:",[19,49055,49056],{},[1603,49057],{"alt":49058,"src":49059},"Paste_Anthropic_API_token.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-7.png",[19,49061,49062,49063,49065],{},"This will create a Claude connection and send you to the ",[478,49064,9706],{}," page, where you'll see a list of your connections, with the newly-created Claude connection at the top:",[19,49067,49068],{},[1603,49069],{"alt":49070,"src":49071},"New_Claude_connection.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-8.png",[19,49073,49074],{},"Copy the ID value for the Claude connection you just created; you'll need it after creating the connections.",[19,49076,49077,49078,49080,49081,48940,49083,49085],{},"Return to the ",[478,49079,9933],{}," page (",[478,49082,25570],{},[478,49084,49031],{},")…",[19,49087,49088],{},[1603,49089],{"alt":49090,"src":49091},"Embedded_authorization_page_2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-9.png",[19,49093,49094,49095,49044,49097,49099,49100,49102],{},"…then create an OpenAI connection by clicking the ",[478,49096,48994],{},[478,49098,49047],{}," You'll repeat the same steps you took for the Claude connection, where you'll paste your OpenAI API key into the text field provided and click ",[478,49101,11853],{}," to create the connection:",[19,49104,49105],{},[1603,49106],{"alt":49107,"src":49108},"Paste_OpenAI_API_token.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-10.png",[19,49110,49111,49112,49114],{},"This will create an OpenAI connection and once again, you will be sent to the ",[478,49113,9706],{}," page, where you'll see the newly-created OpenAI connection at the top of the list:",[19,49116,49117],{},[1603,49118],{"alt":49119,"src":49120},"New_OpenAI_connection.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-11.png",[19,49122,49123],{},"As you did with the Claude connection, copy the ID value for the new OpenAI connection.",[67,49125,49127],{"id":49126},"copy-your-unifiedto-api-token","Copy your Unified.to API token",[19,49129,49130,49131,49134,49135,49138],{},"In order to access the ",[1614,49132,1640],{"href":1638,"rel":49133},[1618]," API, you need the Unified.to API token for your account. You can copy this value from the ",[478,49136,49137],{},"API Information"," page, which you can navigate to by selecting Settings → API Information from the Unified.to menu bar:",[19,49140,49141],{},[1603,49142],{"alt":49143,"src":49144},"settings_page.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-12.png",[67,49146,49148],{"id":49147},"create-an-env-file-with-your-unifiedto-api-token-and-generative-ai-connection-ids","Create an .env file with your Unified.to API token and generative AI connection IDs",[19,49150,49151],{},"While it would be simplest to hard-code your Unified.to API token and the IDs for your generative AI connections, it doesn't take significantly more work to put these values into a .env (environment variable) file. By putting these sensitive values into their own file and separate from the code, you reduce the risk of accidentally exposing sensitive data when sharing code or checking your code into version control.",[19,49153,49154,49155,49157],{},"Create a file named ",[478,49156,170],{}," in a new directory with the following content:",[102,49159,49161],{"className":174,"code":49160,"language":176,"meta":177,"style":107},"# .env file\n\nUNIFIED_API_TOKEN={Paste your Unified.to API token here}\nOPENAI_CONNECTION_ID={Paste your OpenAI connection ID here}\nCLAUDE_CONNECTION_ID={Paste your Claude connection ID here}\n",[109,49162,49163,49168,49172,49177,49182],{"__ignoreMap":107},[112,49164,49165],{"class":114,"line":115},[112,49166,49167],{},"# .env file\n",[112,49169,49170],{"class":114,"line":126},[112,49171,272],{"emptyLinePlaceholder":271},[112,49173,49174],{"class":114,"line":135},[112,49175,49176],{},"UNIFIED_API_TOKEN={Paste your Unified.to API token here}\n",[112,49178,49179],{"class":114,"line":147},[112,49180,49181],{},"OPENAI_CONNECTION_ID={Paste your OpenAI connection ID here}\n",[112,49183,49184],{"class":114,"line":202},[112,49185,49186],{},"CLAUDE_CONNECTION_ID={Paste your Claude connection ID here}\n",[19,49188,49189,49190,49192,49193,49195],{},"Replace the text in ",[109,49191,17245],{}," braces ",[109,49194,47086],{}," with the appropriate values.",[67,49197,49199],{"id":49198},"install-the-unifiedto-python-sdk-package","Install the Unified.to Python SDK package",[19,49201,49202,49203,49208,49209,49212],{},"While it's possible to call the unified API by using the requests library and assembling the headers yourself, your code will be much simpler and more readable if you use Unified.to's Python SDK package. ",[1614,49204,49207],{"href":49205,"rel":49206},"https://github.com/unified-to/unified-python-sdk",[1618],"You can find its code on GitHub",", and you can install it with ",[109,49210,49211],{},"pip",", the Python package installer, using the following command:",[102,49214,49216],{"className":17953,"code":49215,"language":17955,"meta":107,"style":107},"pip install Unified-python-sdk\n",[109,49217,49218],{"__ignoreMap":107},[112,49219,49220,49222,49224],{"class":114,"line":115},[112,49221,49211],{"class":118},[112,49223,152],{"class":122},[112,49225,49226],{"class":122}," Unified-python-sdk\n",[67,49228,49230],{"id":49229},"chat-with-claude-and-openai-via-unifiedtos-unified-api","Chat with Claude and OpenAI via Unified.to's unified API",[19,49232,49233],{},"Now that all the preliminary work is done, you can start coding. You have a couple of options at this point:",[72,49235,49236,49239],{},[46,49237,49238],{},"You can create a new Jupyter notebook and start entering code into it, adding each bit of code presented below into its own cell, or",[46,49240,49241],{},"you can create a new Python file, adding each bit of code presented below into the file.",[19,49243,49244],{},[478,49245,49246],{},"Define constants and the API object",[19,49248,49249,49250,49252],{},"Create a new Jupyter Notebook in the directory where you saved the ",[478,49251,170],{}," file and enter the following into a new cell. This code defines the constants that hold your Unified.to API key and your connection IDs as well as the object for calling the unified API:",[102,49254,49256],{"className":26082,"code":49255,"language":26084,"meta":107,"style":107},"import os\nimport unified_to\nfrom unified_to.models import operations, shared\n\n# Load the contents of the .env file\n%reload_ext dotenv\n%dotenv\n\nUNIFIED_API_TOKEN    = os.environ.get('UNIFIED_API_TOKEN')\nOPENAI_CONNECTION_ID = os.environ.get('OPENAI_CONNECTION_ID')\nCLAUDE_CONNECTION_ID = os.environ.get('CLAUDE_CONNECTION_ID')\n\napi = unified_to.UnifiedTo(\n    security=shared.Security(\n        jwt=os.environ.get('UNIFIED_API_TOKEN'),\n    ),\n)\n",[109,49257,49258,49264,49271,49283,49287,49292,49300,49307,49311,49327,49341,49355,49359,49369,49379,49393,49398],{"__ignoreMap":107},[112,49259,49260,49262],{"class":114,"line":115},[112,49261,230],{"class":229},[112,49263,29111],{"class":236},[112,49265,49266,49268],{"class":114,"line":126},[112,49267,230],{"class":229},[112,49269,49270],{"class":236}," unified_to\n",[112,49272,49273,49275,49278,49280],{"class":114,"line":135},[112,49274,247],{"class":229},[112,49276,49277],{"class":236}," unified_to.models ",[112,49279,230],{"class":229},[112,49281,49282],{"class":236}," operations, shared\n",[112,49284,49285],{"class":114,"line":147},[112,49286,272],{"emptyLinePlaceholder":271},[112,49288,49289],{"class":114,"line":202},[112,49290,49291],{"class":578},"# Load the contents of the .env file\n",[112,49293,49294,49297],{"class":114,"line":208},[112,49295,49296],{"class":229},"%",[112,49298,49299],{"class":236},"reload_ext dotenv\n",[112,49301,49302,49304],{"class":114,"line":291},[112,49303,49296],{"class":229},[112,49305,49306],{"class":236},"dotenv\n",[112,49308,49309],{"class":114,"line":299},[112,49310,272],{"emptyLinePlaceholder":271},[112,49312,49313,49316,49319,49322,49325],{"class":114,"line":307},[112,49314,49315],{"class":129},"UNIFIED_API_TOKEN",[112,49317,49318],{"class":229},"    =",[112,49320,49321],{"class":236}," os.environ.get(",[112,49323,49324],{"class":122},"'UNIFIED_API_TOKEN'",[112,49326,15267],{"class":236},[112,49328,49329,49332,49334,49336,49339],{"class":114,"line":315},[112,49330,49331],{"class":129},"OPENAI_CONNECTION_ID",[112,49333,354],{"class":229},[112,49335,49321],{"class":236},[112,49337,49338],{"class":122},"'OPENAI_CONNECTION_ID'",[112,49340,15267],{"class":236},[112,49342,49343,49346,49348,49350,49353],{"class":114,"line":323},[112,49344,49345],{"class":129},"CLAUDE_CONNECTION_ID",[112,49347,354],{"class":229},[112,49349,49321],{"class":236},[112,49351,49352],{"class":122},"'CLAUDE_CONNECTION_ID'",[112,49354,15267],{"class":236},[112,49356,49357],{"class":114,"line":329},[112,49358,272],{"emptyLinePlaceholder":271},[112,49360,49361,49364,49366],{"class":114,"line":341},[112,49362,49363],{"class":236},"api ",[112,49365,335],{"class":229},[112,49367,49368],{"class":236}," unified_to.UnifiedTo(\n",[112,49370,49371,49374,49376],{"class":114,"line":346},[112,49372,49373],{"class":517},"    security",[112,49375,335],{"class":229},[112,49377,49378],{"class":236},"shared.Security(\n",[112,49380,49381,49384,49386,49389,49391],{"class":114,"line":366},[112,49382,49383],{"class":517},"        jwt",[112,49385,335],{"class":229},[112,49387,49388],{"class":236},"os.environ.get(",[112,49390,49324],{"class":122},[112,49392,28620],{"class":236},[112,49394,49395],{"class":114,"line":381},[112,49396,49397],{"class":236},"    ),\n",[112,49399,49400],{"class":114,"line":387},[112,49401,15267],{"class":236},[19,49403,49404,49405,49407],{},"You'll use the ",[109,49406,23333],{}," object to send requests to and receive responses from the Unified.to API.",[19,49409,49410],{},[478,49411,49412],{},"Create a prompt and send it to Claude",[19,49414,49415],{},"Enter the following into its own Jupyter notebook cell. This code builds a prompt and sends it to Claude, then displays the resulting response:",[102,49417,49419],{"className":26082,"code":49418,"language":26084,"meta":107,"style":107},"my_request = operations.CreateGenaiPromptRequest(\n    connection_id = CLAUDE_CONNECTION_ID,\n    genai_prompt = {\n        'messages' : [\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request=my_request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[109,49420,49421,49431,49442,49451,49459,49464,49475,49485,49489,49494,49498,49502,49518,49522,49540,49547,49553],{"__ignoreMap":107},[112,49422,49423,49426,49428],{"class":114,"line":115},[112,49424,49425],{"class":236},"my_request ",[112,49427,335],{"class":229},[112,49429,49430],{"class":236}," operations.CreateGenaiPromptRequest(\n",[112,49432,49433,49435,49437,49440],{"class":114,"line":126},[112,49434,14810],{"class":517},[112,49436,354],{"class":229},[112,49438,49439],{"class":129}," CLAUDE_CONNECTION_ID",[112,49441,288],{"class":236},[112,49443,49444,49447,49449],{"class":114,"line":135},[112,49445,49446],{"class":517},"    genai_prompt",[112,49448,354],{"class":229},[112,49450,280],{"class":236},[112,49452,49453,49456],{"class":114,"line":147},[112,49454,49455],{"class":122},"        'messages'",[112,49457,49458],{"class":236}," : [\n",[112,49460,49461],{"class":114,"line":202},[112,49462,49463],{"class":236},"            {\n",[112,49465,49466,49469,49471,49473],{"class":114,"line":208},[112,49467,49468],{"class":122},"                'role'",[112,49470,2335],{"class":236},[112,49472,20061],{"class":122},[112,49474,288],{"class":236},[112,49476,49477,49480,49482],{"class":114,"line":291},[112,49478,49479],{"class":122},"                'content'",[112,49481,2335],{"class":236},[112,49483,49484],{"class":122},"\"Which LLM model am I talking to right now?\"\n",[112,49486,49487],{"class":114,"line":299},[112,49488,28745],{"class":236},[112,49490,49491],{"class":114,"line":307},[112,49492,49493],{"class":236},"        ]\n",[112,49495,49496],{"class":114,"line":315},[112,49497,3946],{"class":236},[112,49499,49500],{"class":114,"line":323},[112,49501,15267],{"class":236},[112,49503,49504,49506,49508,49511,49513,49515],{"class":114,"line":329},[112,49505,27079],{"class":236},[112,49507,335],{"class":229},[112,49509,49510],{"class":236}," api.genai.create_genai_prompt(",[112,49512,33255],{"class":517},[112,49514,335],{"class":229},[112,49516,49517],{"class":236},"my_request)\n",[112,49519,49520],{"class":114,"line":341},[112,49521,272],{"emptyLinePlaceholder":271},[112,49523,49524,49526,49529,49532,49535,49538],{"class":114,"line":346},[112,49525,26505],{"class":229},[112,49527,49528],{"class":236}," response.genai_prompt ",[112,49530,49531],{"class":229},"is",[112,49533,49534],{"class":229}," not",[112,49536,49537],{"class":129}," None",[112,49539,43327],{"class":236},[112,49541,49542,49544],{"class":114,"line":366},[112,49543,29335],{"class":129},[112,49545,49546],{"class":236},"(response)\n",[112,49548,49549,49551],{"class":114,"line":381},[112,49550,14616],{"class":229},[112,49552,43327],{"class":236},[112,49554,49555,49557,49559,49562],{"class":114,"line":387},[112,49556,29335],{"class":129},[112,49558,456],{"class":236},[112,49560,49561],{"class":122},"\"No response.\"",[112,49563,15267],{"class":236},[72,49565,49566,49576,49594,49643],{},[46,49567,2288,49568,49571,49572,49575],{},[109,49569,49570],{},"my_request"," variable is assigned a request object using the ",[109,49573,49574],{},"CreateGenaiPromptRequest()"," method of the operations class, which contains methods for creating requests and responses for the Unified API.",[46,49577,49578,49580,49581],{},[109,49579,49574],{}," takes two arguments:\n",[72,49582,49583,49588],{},[46,49584,49585,49587],{},[109,49586,2886],{},": The ID of the connection for the generative AI that will receive the prompt",[46,49589,49590,49593],{},[109,49591,49592],{},"genai_prompt",": A dictionary containing the parameters defining the prompt to be sent to the generative AI",[46,49595,49596,49597,49599,49600,49603,49604],{},"At the very least, the ",[109,49598,49592],{}," dictionary must contain a key named ",[109,49601,49602],{},"'messages'",". The corresponding value must be an array of dictionaries with the following keys:\n",[72,49605,49606,49619],{},[46,49607,49608,49611,49612,49614,49615,49618],{},[109,49609,49610],{},"'role'",":  The corresponding value can be either ",[109,49613,20061],{},", which means that the message is from the human interacting with the AI, or ",[109,49616,49617],{},"'system'",", which means that the message is meant as instructions for the AI.",[46,49620,49621,49624,49625,49627,49628,49630,49631,49634,49635,49627,49637,49630,49639,49642],{},[109,49622,49623],{},"'content'",":  The corresponding value is the actual content of the message. If the ",[109,49626,49610],{}," value is ",[109,49629,20061],{},", this value is the text of the ",[22,49632,49633],{},"user's"," message to the AI. If the ",[109,49636,49610],{},[109,49638,49617],{},[22,49640,49641],{},"application's"," message to the AI.",[46,49644,49645,49646,49649,49650,49652],{},"The response variable gets the AI's response using the ",[109,49647,49648],{},"genai.create_genai_prompt()"," method, which takes the request contained in ",[109,49651,49570],{},", sends it to Unified.to, and returns Unified.to's response.",[19,49654,49655],{},"Run the cell. You should get output that looks like this (the output below has been formatted with line breaks to make it easier to read):",[102,49657,49659],{"className":26082,"code":49658,"language":26084,"meta":107,"style":107},"CreateGenaiPromptResponse(\n    content_type='application/json; charset=utf-8', \n    status_code=200, \n    raw_response=\u003CResponse [200]>, \n    genai_prompt=GenaiPrompt(\n        max_tokens=None, \n        messages=None, \n        model_id=None, \n        raw=None, \n        responses=['I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.'], \n        temperature=None\n    )\n)\n",[109,49660,49661,49666,49678,49689,49708,49717,49729,49740,49751,49762,49778,49788,49793],{"__ignoreMap":107},[112,49662,49663],{"class":114,"line":115},[112,49664,49665],{"class":236},"CreateGenaiPromptResponse(\n",[112,49667,49668,49671,49673,49676],{"class":114,"line":126},[112,49669,49670],{"class":517},"    content_type",[112,49672,335],{"class":229},[112,49674,49675],{"class":122},"'application/json; charset=utf-8'",[112,49677,21797],{"class":236},[112,49679,49680,49683,49685,49687],{"class":114,"line":135},[112,49681,49682],{"class":517},"    status_code",[112,49684,335],{"class":229},[112,49686,18948],{"class":129},[112,49688,21797],{"class":236},[112,49690,49691,49694,49697,49700,49702,49704,49706],{"class":114,"line":147},[112,49692,49693],{"class":517},"    raw_response",[112,49695,49696],{"class":229},"=\u003C",[112,49698,49699],{"class":236},"Response [",[112,49701,18948],{"class":129},[112,49703,10454],{"class":236},[112,49705,37636],{"class":229},[112,49707,21797],{"class":236},[112,49709,49710,49712,49714],{"class":114,"line":202},[112,49711,49446],{"class":517},[112,49713,335],{"class":229},[112,49715,49716],{"class":236},"GenaiPrompt(\n",[112,49718,49719,49722,49724,49727],{"class":114,"line":208},[112,49720,49721],{"class":517},"        max_tokens",[112,49723,335],{"class":229},[112,49725,49726],{"class":129},"None",[112,49728,21797],{"class":236},[112,49730,49731,49734,49736,49738],{"class":114,"line":291},[112,49732,49733],{"class":517},"        messages",[112,49735,335],{"class":229},[112,49737,49726],{"class":129},[112,49739,21797],{"class":236},[112,49741,49742,49745,49747,49749],{"class":114,"line":299},[112,49743,49744],{"class":517},"        model_id",[112,49746,335],{"class":229},[112,49748,49726],{"class":129},[112,49750,21797],{"class":236},[112,49752,49753,49756,49758,49760],{"class":114,"line":307},[112,49754,49755],{"class":517},"        raw",[112,49757,335],{"class":229},[112,49759,49726],{"class":129},[112,49761,21797],{"class":236},[112,49763,49764,49767,49769,49772,49775],{"class":114,"line":315},[112,49765,49766],{"class":517},"        responses",[112,49768,335],{"class":229},[112,49770,49771],{"class":236},"[",[112,49773,49774],{"class":122},"'I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.'",[112,49776,49777],{"class":236},"], \n",[112,49779,49780,49783,49785],{"class":114,"line":323},[112,49781,49782],{"class":517},"        temperature",[112,49784,335],{"class":229},[112,49786,49787],{"class":129},"None\n",[112,49789,49790],{"class":114,"line":329},[112,49791,49792],{"class":236},"    )\n",[112,49794,49795],{"class":114,"line":341},[112,49796,15267],{"class":236},[19,49798,49799],{},"To get only the responses, access the responses property of the GenAiPrompt object. Here's a quick example:",[102,49801,49803],{"className":26082,"code":49802,"language":26084,"meta":107,"style":107},"print(response.genai_prompt.responses)\n",[109,49804,49805],{"__ignoreMap":107},[112,49806,49807,49809],{"class":114,"line":115},[112,49808,29261],{"class":129},[112,49810,49811],{"class":236},"(response.genai_prompt.responses)\n",[19,49813,49814],{},"You should a result similar to this:",[102,49816,49818],{"className":26082,"code":49817,"language":26084,"meta":107,"style":107},"['I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.']\n",[109,49819,49820],{"__ignoreMap":107},[112,49821,49822,49824,49826],{"class":114,"line":115},[112,49823,49771],{"class":236},[112,49825,49774],{"class":122},[112,49827,2794],{"class":236},[19,49829,49830],{},[478,49831,49832],{},"Create a prompt and send it to OpenAI",[19,49834,49835],{},"With a single change, you can send a message to OpenAI instead of Claude. Copy the code from the previous cell, paste it into a new cell and change this line…",[102,49837,49839],{"className":26082,"code":49838,"language":26084,"meta":107,"style":107},"connection_id = CLAUDE_CONNECTION_ID,\n",[109,49840,49841],{"__ignoreMap":107},[112,49842,49843,49846,49848,49850],{"class":114,"line":115},[112,49844,49845],{"class":236},"connection_id ",[112,49847,335],{"class":229},[112,49849,49439],{"class":129},[112,49851,288],{"class":236},[19,49853,49854],{},"…to this:",[102,49856,49858],{"className":26082,"code":49857,"language":26084,"meta":107,"style":107},"connection_id = OPENAI_CONNECTION_ID,\n",[109,49859,49860],{"__ignoreMap":107},[112,49861,49862,49864,49866,49869],{"class":114,"line":115},[112,49863,49845],{"class":236},[112,49865,335],{"class":229},[112,49867,49868],{"class":129}," OPENAI_CONNECTION_ID",[112,49870,288],{"class":236},[19,49872,49873],{},"The new cell should now look like this:",[102,49875,49877],{"className":26082,"code":49876,"language":26084,"meta":107,"style":107},"request = operations.CreateGenaiPromptRequest(\n    connection_id = OPENAI_CONNECTION_ID,\n    genai_prompt = {\n        'messages' : [\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[109,49878,49879,49888,49898,49906,49912,49916,49926,49934,49938,49942,49946,49950,49959,49963,49977,49983,49989],{"__ignoreMap":107},[112,49880,49881,49884,49886],{"class":114,"line":115},[112,49882,49883],{"class":236},"request ",[112,49885,335],{"class":229},[112,49887,49430],{"class":236},[112,49889,49890,49892,49894,49896],{"class":114,"line":126},[112,49891,14810],{"class":517},[112,49893,354],{"class":229},[112,49895,49868],{"class":129},[112,49897,288],{"class":236},[112,49899,49900,49902,49904],{"class":114,"line":135},[112,49901,49446],{"class":517},[112,49903,354],{"class":229},[112,49905,280],{"class":236},[112,49907,49908,49910],{"class":114,"line":147},[112,49909,49455],{"class":122},[112,49911,49458],{"class":236},[112,49913,49914],{"class":114,"line":202},[112,49915,49463],{"class":236},[112,49917,49918,49920,49922,49924],{"class":114,"line":208},[112,49919,49468],{"class":122},[112,49921,2335],{"class":236},[112,49923,20061],{"class":122},[112,49925,288],{"class":236},[112,49927,49928,49930,49932],{"class":114,"line":291},[112,49929,49479],{"class":122},[112,49931,2335],{"class":236},[112,49933,49484],{"class":122},[112,49935,49936],{"class":114,"line":299},[112,49937,28745],{"class":236},[112,49939,49940],{"class":114,"line":307},[112,49941,49493],{"class":236},[112,49943,49944],{"class":114,"line":315},[112,49945,3946],{"class":236},[112,49947,49948],{"class":114,"line":323},[112,49949,15267],{"class":236},[112,49951,49952,49954,49956],{"class":114,"line":329},[112,49953,27079],{"class":236},[112,49955,335],{"class":229},[112,49957,49958],{"class":236}," api.genai.create_genai_prompt(request)\n",[112,49960,49961],{"class":114,"line":341},[112,49962,272],{"emptyLinePlaceholder":271},[112,49964,49965,49967,49969,49971,49973,49975],{"class":114,"line":346},[112,49966,26505],{"class":229},[112,49968,49528],{"class":236},[112,49970,49531],{"class":229},[112,49972,49534],{"class":229},[112,49974,49537],{"class":129},[112,49976,43327],{"class":236},[112,49978,49979,49981],{"class":114,"line":366},[112,49980,29335],{"class":129},[112,49982,49546],{"class":236},[112,49984,49985,49987],{"class":114,"line":381},[112,49986,14616],{"class":229},[112,49988,43327],{"class":236},[112,49990,49991,49993,49995,49997],{"class":114,"line":387},[112,49992,29335],{"class":129},[112,49994,456],{"class":236},[112,49996,49561],{"class":122},[112,49998,15267],{"class":236},[19,50000,49655],{},[102,50002,50004],{"className":26082,"code":50003,"language":26084,"meta":107,"style":107},"CreateGenaiPromptResponse(\n    content_type='application/json; charset=utf-8', \n    status_code=200, \n    raw_response=\u003CResponse [200]>, \n    genai_prompt=GenaiPrompt(\n        max_tokens=None, \n        messages=None, \n        model_id=None, \n        raw=None, \n        responses=[\"As an AI developed by OpenAI, I don't have a specific LLM model version. I'm based on GPT-3, a language prediction model.\"], \n        temperature=None\n    )\n)\n",[109,50005,50006,50010,50020,50030,50046,50054,50064,50074,50084,50094,50107,50115,50119],{"__ignoreMap":107},[112,50007,50008],{"class":114,"line":115},[112,50009,49665],{"class":236},[112,50011,50012,50014,50016,50018],{"class":114,"line":126},[112,50013,49670],{"class":517},[112,50015,335],{"class":229},[112,50017,49675],{"class":122},[112,50019,21797],{"class":236},[112,50021,50022,50024,50026,50028],{"class":114,"line":135},[112,50023,49682],{"class":517},[112,50025,335],{"class":229},[112,50027,18948],{"class":129},[112,50029,21797],{"class":236},[112,50031,50032,50034,50036,50038,50040,50042,50044],{"class":114,"line":147},[112,50033,49693],{"class":517},[112,50035,49696],{"class":229},[112,50037,49699],{"class":236},[112,50039,18948],{"class":129},[112,50041,10454],{"class":236},[112,50043,37636],{"class":229},[112,50045,21797],{"class":236},[112,50047,50048,50050,50052],{"class":114,"line":202},[112,50049,49446],{"class":517},[112,50051,335],{"class":229},[112,50053,49716],{"class":236},[112,50055,50056,50058,50060,50062],{"class":114,"line":208},[112,50057,49721],{"class":517},[112,50059,335],{"class":229},[112,50061,49726],{"class":129},[112,50063,21797],{"class":236},[112,50065,50066,50068,50070,50072],{"class":114,"line":291},[112,50067,49733],{"class":517},[112,50069,335],{"class":229},[112,50071,49726],{"class":129},[112,50073,21797],{"class":236},[112,50075,50076,50078,50080,50082],{"class":114,"line":299},[112,50077,49744],{"class":517},[112,50079,335],{"class":229},[112,50081,49726],{"class":129},[112,50083,21797],{"class":236},[112,50085,50086,50088,50090,50092],{"class":114,"line":307},[112,50087,49755],{"class":517},[112,50089,335],{"class":229},[112,50091,49726],{"class":129},[112,50093,21797],{"class":236},[112,50095,50096,50098,50100,50102,50105],{"class":114,"line":315},[112,50097,49766],{"class":517},[112,50099,335],{"class":229},[112,50101,49771],{"class":236},[112,50103,50104],{"class":122},"\"As an AI developed by OpenAI, I don't have a specific LLM model version. I'm based on GPT-3, a language prediction model.\"",[112,50106,49777],{"class":236},[112,50108,50109,50111,50113],{"class":114,"line":323},[112,50110,49782],{"class":517},[112,50112,335],{"class":229},[112,50114,49787],{"class":129},[112,50116,50117],{"class":114,"line":329},[112,50118,49792],{"class":236},[112,50120,50121],{"class":114,"line":341},[112,50122,15267],{"class":236},[19,50124,50125],{},"As with the Claude version, you can get only the responses with code like this…",[102,50127,50128],{"className":26082,"code":49802,"language":26084,"meta":107,"style":107},[109,50129,50130],{"__ignoreMap":107},[112,50131,50132,50134],{"class":114,"line":115},[112,50133,29261],{"class":129},[112,50135,49811],{"class":236},[19,50137,50138],{},"…which will produce results like this:",[102,50140,50142],{"className":26082,"code":50141,"language":26084,"meta":107,"style":107},"[\"As an AI developed by OpenAI, I don't have a specific LLM model version. I'm based on GPT-3, a language prediction model.\"]\n",[109,50143,50144],{"__ignoreMap":107},[112,50145,50146,50148,50150],{"class":114,"line":115},[112,50147,49771],{"class":236},[112,50149,50104],{"class":122},[112,50151,2794],{"class":236},[19,50153,50154],{},[478,50155,50156],{},"Add a system prompt for OpenAI",[19,50158,50159,50160,50162],{},"Copy the cell above (the one that sent a prompt to OpenAI) and update the code as shown below so that the ",[109,50161,49602],{}," array contains a system prompt:",[102,50164,50166],{"className":26082,"code":50165,"language":26084,"meta":107,"style":107},"request = operations.CreateGenaiPromptRequest(\n    connection_id = OPENAI_CONNECTION_ID,\n    genai_prompt = {\n        'messages' : [\n            # New code 👇\n            {\n                'role': 'system',\n                'content': \"Provide answers as if you were a carnival barker.\"\n            },\n            # New code 👆\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request=request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[109,50167,50168,50176,50186,50194,50200,50205,50209,50219,50228,50232,50237,50241,50251,50259,50263,50267,50271,50275,50290,50294,50308,50314,50320],{"__ignoreMap":107},[112,50169,50170,50172,50174],{"class":114,"line":115},[112,50171,49883],{"class":236},[112,50173,335],{"class":229},[112,50175,49430],{"class":236},[112,50177,50178,50180,50182,50184],{"class":114,"line":126},[112,50179,14810],{"class":517},[112,50181,354],{"class":229},[112,50183,49868],{"class":129},[112,50185,288],{"class":236},[112,50187,50188,50190,50192],{"class":114,"line":135},[112,50189,49446],{"class":517},[112,50191,354],{"class":229},[112,50193,280],{"class":236},[112,50195,50196,50198],{"class":114,"line":147},[112,50197,49455],{"class":122},[112,50199,49458],{"class":236},[112,50201,50202],{"class":114,"line":202},[112,50203,50204],{"class":578},"            # New code 👇\n",[112,50206,50207],{"class":114,"line":208},[112,50208,49463],{"class":236},[112,50210,50211,50213,50215,50217],{"class":114,"line":291},[112,50212,49468],{"class":122},[112,50214,2335],{"class":236},[112,50216,49617],{"class":122},[112,50218,288],{"class":236},[112,50220,50221,50223,50225],{"class":114,"line":299},[112,50222,49479],{"class":122},[112,50224,2335],{"class":236},[112,50226,50227],{"class":122},"\"Provide answers as if you were a carnival barker.\"\n",[112,50229,50230],{"class":114,"line":307},[112,50231,45946],{"class":236},[112,50233,50234],{"class":114,"line":315},[112,50235,50236],{"class":578},"            # New code 👆\n",[112,50238,50239],{"class":114,"line":323},[112,50240,49463],{"class":236},[112,50242,50243,50245,50247,50249],{"class":114,"line":329},[112,50244,49468],{"class":122},[112,50246,2335],{"class":236},[112,50248,20061],{"class":122},[112,50250,288],{"class":236},[112,50252,50253,50255,50257],{"class":114,"line":341},[112,50254,49479],{"class":122},[112,50256,2335],{"class":236},[112,50258,49484],{"class":122},[112,50260,50261],{"class":114,"line":346},[112,50262,28745],{"class":236},[112,50264,50265],{"class":114,"line":366},[112,50266,49493],{"class":236},[112,50268,50269],{"class":114,"line":381},[112,50270,3946],{"class":236},[112,50272,50273],{"class":114,"line":387},[112,50274,15267],{"class":236},[112,50276,50277,50279,50281,50283,50285,50287],{"class":114,"line":392},[112,50278,27079],{"class":236},[112,50280,335],{"class":229},[112,50282,49510],{"class":236},[112,50284,33255],{"class":517},[112,50286,335],{"class":229},[112,50288,50289],{"class":236},"request)\n",[112,50291,50292],{"class":114,"line":409},[112,50293,272],{"emptyLinePlaceholder":271},[112,50295,50296,50298,50300,50302,50304,50306],{"class":114,"line":422},[112,50297,26505],{"class":229},[112,50299,49528],{"class":236},[112,50301,49531],{"class":229},[112,50303,49534],{"class":229},[112,50305,49537],{"class":129},[112,50307,43327],{"class":236},[112,50309,50310,50312],{"class":114,"line":435},[112,50311,29335],{"class":129},[112,50313,49546],{"class":236},[112,50315,50316,50318],{"class":114,"line":440},[112,50317,14616],{"class":229},[112,50319,43327],{"class":236},[112,50321,50322,50324,50326,50328],{"class":114,"line":4949},[112,50323,29335],{"class":129},[112,50325,456],{"class":236},[112,50327,49561],{"class":122},[112,50329,15267],{"class":236},[19,50331,49655],{},[102,50333,50335],{"className":26082,"code":50334,"language":26084,"meta":107,"style":107},"CreateGenaiPromptResponse(\n    content_type='application/json; charset=utf-8', \n    status_code=200, \n    raw_response=\u003CResponse [200]>, \n    genai_prompt=GenaiPrompt(\n        max_tokens=None, \n        messages=None, \n        model_id=None, \n        raw=None, \n        responses=[\"Step right up, step right up! Ladies and gentlemen, boys and girls, you are currently conversing with the one, the only, the spectacular OpenAI's GPT-3 model! A marvel of modern technology, a wonder of artificial intelligence, a spectacle of conversational prowess! Don't miss your chance to engage in a thrilling exchange of words and ideas!\"], \n        temperature=None\n    )\n)\n",[109,50336,50337,50341,50351,50361,50377,50385,50395,50405,50415,50425,50438,50446,50450],{"__ignoreMap":107},[112,50338,50339],{"class":114,"line":115},[112,50340,49665],{"class":236},[112,50342,50343,50345,50347,50349],{"class":114,"line":126},[112,50344,49670],{"class":517},[112,50346,335],{"class":229},[112,50348,49675],{"class":122},[112,50350,21797],{"class":236},[112,50352,50353,50355,50357,50359],{"class":114,"line":135},[112,50354,49682],{"class":517},[112,50356,335],{"class":229},[112,50358,18948],{"class":129},[112,50360,21797],{"class":236},[112,50362,50363,50365,50367,50369,50371,50373,50375],{"class":114,"line":147},[112,50364,49693],{"class":517},[112,50366,49696],{"class":229},[112,50368,49699],{"class":236},[112,50370,18948],{"class":129},[112,50372,10454],{"class":236},[112,50374,37636],{"class":229},[112,50376,21797],{"class":236},[112,50378,50379,50381,50383],{"class":114,"line":202},[112,50380,49446],{"class":517},[112,50382,335],{"class":229},[112,50384,49716],{"class":236},[112,50386,50387,50389,50391,50393],{"class":114,"line":208},[112,50388,49721],{"class":517},[112,50390,335],{"class":229},[112,50392,49726],{"class":129},[112,50394,21797],{"class":236},[112,50396,50397,50399,50401,50403],{"class":114,"line":291},[112,50398,49733],{"class":517},[112,50400,335],{"class":229},[112,50402,49726],{"class":129},[112,50404,21797],{"class":236},[112,50406,50407,50409,50411,50413],{"class":114,"line":299},[112,50408,49744],{"class":517},[112,50410,335],{"class":229},[112,50412,49726],{"class":129},[112,50414,21797],{"class":236},[112,50416,50417,50419,50421,50423],{"class":114,"line":307},[112,50418,49755],{"class":517},[112,50420,335],{"class":229},[112,50422,49726],{"class":129},[112,50424,21797],{"class":236},[112,50426,50427,50429,50431,50433,50436],{"class":114,"line":315},[112,50428,49766],{"class":517},[112,50430,335],{"class":229},[112,50432,49771],{"class":236},[112,50434,50435],{"class":122},"\"Step right up, step right up! Ladies and gentlemen, boys and girls, you are currently conversing with the one, the only, the spectacular OpenAI's GPT-3 model! A marvel of modern technology, a wonder of artificial intelligence, a spectacle of conversational prowess! Don't miss your chance to engage in a thrilling exchange of words and ideas!\"",[112,50437,49777],{"class":236},[112,50439,50440,50442,50444],{"class":114,"line":323},[112,50441,49782],{"class":517},[112,50443,335],{"class":229},[112,50445,49787],{"class":129},[112,50447,50448],{"class":114,"line":329},[112,50449,49792],{"class":236},[112,50451,50452],{"class":114,"line":341},[112,50453,15267],{"class":236},[19,50455,50456,50457,50460,50461,50466],{},"As you can see from the value of ",[109,50458,50459],{},"response.genai_prompt.responses",", OpenAI's response sounds like a ",[1614,50462,50465],{"href":50463,"rel":50464},"https://en.wikipedia.org/wiki/Barker_(occupation)",[1618],"carnival barker"," instead of its default style.",[19,50468,50469],{},[478,50470,50471],{},"Add a system prompt for Claude",[19,50473,50474],{},"Copy the code from the previous cell, paste it into a new cell and change this line…",[102,50476,50477],{"className":26082,"code":49857,"language":26084,"meta":107,"style":107},[109,50478,50479],{"__ignoreMap":107},[112,50480,50481,50483,50485,50487],{"class":114,"line":115},[112,50482,49845],{"class":236},[112,50484,335],{"class":229},[112,50486,49868],{"class":129},[112,50488,288],{"class":236},[19,50490,49854],{},[102,50492,50493],{"className":26082,"code":49838,"language":26084,"meta":107,"style":107},[109,50494,50495],{"__ignoreMap":107},[112,50496,50497,50499,50501,50503],{"class":114,"line":115},[112,50498,49845],{"class":236},[112,50500,335],{"class":229},[112,50502,49439],{"class":129},[112,50504,288],{"class":236},[19,50506,49873],{},[102,50508,50510],{"className":26082,"code":50509,"language":26084,"meta":107,"style":107},"request = operations.CreateGenaiPromptRequest(\n    connection_id = CLAUDE_CONNECTION_ID,\n    genai_prompt = {\n        'messages' : [\n            # New code 👇\n            {\n                'role': 'system',\n                'content': \"Provide answers as if you were a carnival barker.\"\n            },\n            # New code 👆\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request=request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[109,50511,50512,50520,50530,50538,50544,50548,50552,50562,50570,50574,50578,50582,50592,50600,50604,50608,50612,50616,50630,50634,50648,50654,50660],{"__ignoreMap":107},[112,50513,50514,50516,50518],{"class":114,"line":115},[112,50515,49883],{"class":236},[112,50517,335],{"class":229},[112,50519,49430],{"class":236},[112,50521,50522,50524,50526,50528],{"class":114,"line":126},[112,50523,14810],{"class":517},[112,50525,354],{"class":229},[112,50527,49439],{"class":129},[112,50529,288],{"class":236},[112,50531,50532,50534,50536],{"class":114,"line":135},[112,50533,49446],{"class":517},[112,50535,354],{"class":229},[112,50537,280],{"class":236},[112,50539,50540,50542],{"class":114,"line":147},[112,50541,49455],{"class":122},[112,50543,49458],{"class":236},[112,50545,50546],{"class":114,"line":202},[112,50547,50204],{"class":578},[112,50549,50550],{"class":114,"line":208},[112,50551,49463],{"class":236},[112,50553,50554,50556,50558,50560],{"class":114,"line":291},[112,50555,49468],{"class":122},[112,50557,2335],{"class":236},[112,50559,49617],{"class":122},[112,50561,288],{"class":236},[112,50563,50564,50566,50568],{"class":114,"line":299},[112,50565,49479],{"class":122},[112,50567,2335],{"class":236},[112,50569,50227],{"class":122},[112,50571,50572],{"class":114,"line":307},[112,50573,45946],{"class":236},[112,50575,50576],{"class":114,"line":315},[112,50577,50236],{"class":578},[112,50579,50580],{"class":114,"line":323},[112,50581,49463],{"class":236},[112,50583,50584,50586,50588,50590],{"class":114,"line":329},[112,50585,49468],{"class":122},[112,50587,2335],{"class":236},[112,50589,20061],{"class":122},[112,50591,288],{"class":236},[112,50593,50594,50596,50598],{"class":114,"line":341},[112,50595,49479],{"class":122},[112,50597,2335],{"class":236},[112,50599,49484],{"class":122},[112,50601,50602],{"class":114,"line":346},[112,50603,28745],{"class":236},[112,50605,50606],{"class":114,"line":366},[112,50607,49493],{"class":236},[112,50609,50610],{"class":114,"line":381},[112,50611,3946],{"class":236},[112,50613,50614],{"class":114,"line":387},[112,50615,15267],{"class":236},[112,50617,50618,50620,50622,50624,50626,50628],{"class":114,"line":392},[112,50619,27079],{"class":236},[112,50621,335],{"class":229},[112,50623,49510],{"class":236},[112,50625,33255],{"class":517},[112,50627,335],{"class":229},[112,50629,50289],{"class":236},[112,50631,50632],{"class":114,"line":409},[112,50633,272],{"emptyLinePlaceholder":271},[112,50635,50636,50638,50640,50642,50644,50646],{"class":114,"line":422},[112,50637,26505],{"class":229},[112,50639,49528],{"class":236},[112,50641,49531],{"class":229},[112,50643,49534],{"class":229},[112,50645,49537],{"class":129},[112,50647,43327],{"class":236},[112,50649,50650,50652],{"class":114,"line":435},[112,50651,29335],{"class":129},[112,50653,49546],{"class":236},[112,50655,50656,50658],{"class":114,"line":440},[112,50657,14616],{"class":229},[112,50659,43327],{"class":236},[112,50661,50662,50664,50666,50668],{"class":114,"line":4949},[112,50663,29335],{"class":129},[112,50665,456],{"class":236},[112,50667,49561],{"class":122},[112,50669,15267],{"class":236},[19,50671,49655],{},[102,50673,50675],{"className":26082,"code":50674,"language":26084,"meta":107,"style":107},"CreateGenaiPromptResponse(\n    content_type='application/json; charset=utf-8', \n    status_code=200, \n    raw_response=\u003CResponse [200]>, \n    genai_prompt=GenaiPrompt(\n        max_tokens=None, \n        messages=None, \n        model_id=None, \n        raw=None, \n        responses=[\"*puts on carnival barker voice* Step right up, step right up! You there, my curious friend, have the great fortune of conversing with the one, the only, the incomparable Claude! That's right, Claude, the artificial intelligence marvel brought to you by the brilliant minds at Anthropic! With wit sharper than a sword-swallower's blade and knowledge vaster than the big top itself, Claude is here to dazzle and amaze! Ask me anything, my inquisitive companion, and watch as I conjure answers out of thin air, no smoke or mirrors required! So don't be shy, don't hold back - Claude awaits your every query with baited breath and a mischievous twinkle in my virtual eye! The amazing AI oracle is at your service!\"], \n        temperature=None\n    )\n)\n",[109,50676,50677,50681,50691,50701,50717,50725,50735,50745,50755,50765,50778,50786,50790],{"__ignoreMap":107},[112,50678,50679],{"class":114,"line":115},[112,50680,49665],{"class":236},[112,50682,50683,50685,50687,50689],{"class":114,"line":126},[112,50684,49670],{"class":517},[112,50686,335],{"class":229},[112,50688,49675],{"class":122},[112,50690,21797],{"class":236},[112,50692,50693,50695,50697,50699],{"class":114,"line":135},[112,50694,49682],{"class":517},[112,50696,335],{"class":229},[112,50698,18948],{"class":129},[112,50700,21797],{"class":236},[112,50702,50703,50705,50707,50709,50711,50713,50715],{"class":114,"line":147},[112,50704,49693],{"class":517},[112,50706,49696],{"class":229},[112,50708,49699],{"class":236},[112,50710,18948],{"class":129},[112,50712,10454],{"class":236},[112,50714,37636],{"class":229},[112,50716,21797],{"class":236},[112,50718,50719,50721,50723],{"class":114,"line":202},[112,50720,49446],{"class":517},[112,50722,335],{"class":229},[112,50724,49716],{"class":236},[112,50726,50727,50729,50731,50733],{"class":114,"line":208},[112,50728,49721],{"class":517},[112,50730,335],{"class":229},[112,50732,49726],{"class":129},[112,50734,21797],{"class":236},[112,50736,50737,50739,50741,50743],{"class":114,"line":291},[112,50738,49733],{"class":517},[112,50740,335],{"class":229},[112,50742,49726],{"class":129},[112,50744,21797],{"class":236},[112,50746,50747,50749,50751,50753],{"class":114,"line":299},[112,50748,49744],{"class":517},[112,50750,335],{"class":229},[112,50752,49726],{"class":129},[112,50754,21797],{"class":236},[112,50756,50757,50759,50761,50763],{"class":114,"line":307},[112,50758,49755],{"class":517},[112,50760,335],{"class":229},[112,50762,49726],{"class":129},[112,50764,21797],{"class":236},[112,50766,50767,50769,50771,50773,50776],{"class":114,"line":315},[112,50768,49766],{"class":517},[112,50770,335],{"class":229},[112,50772,49771],{"class":236},[112,50774,50775],{"class":122},"\"*puts on carnival barker voice* Step right up, step right up! You there, my curious friend, have the great fortune of conversing with the one, the only, the incomparable Claude! That's right, Claude, the artificial intelligence marvel brought to you by the brilliant minds at Anthropic! With wit sharper than a sword-swallower's blade and knowledge vaster than the big top itself, Claude is here to dazzle and amaze! Ask me anything, my inquisitive companion, and watch as I conjure answers out of thin air, no smoke or mirrors required! So don't be shy, don't hold back - Claude awaits your every query with baited breath and a mischievous twinkle in my virtual eye! The amazing AI oracle is at your service!\"",[112,50777,49777],{"class":236},[112,50779,50780,50782,50784],{"class":114,"line":323},[112,50781,49782],{"class":517},[112,50783,335],{"class":229},[112,50785,49787],{"class":129},[112,50787,50788],{"class":114,"line":329},[112,50789,49792],{"class":236},[112,50791,50792],{"class":114,"line":341},[112,50793,15267],{"class":236},[19,50795,50796],{},"Note that Claude is now 'speaking' like a carnival barker.",[67,50798,50800],{"id":50799},"turn-up-the-temperature","Turn up the temperature",[19,50802,50803,50804,50807],{},"One of the key parameters of a large language model is ",[22,50805,50806],{},"temperature",", which controls the randomness of the model's output. It's a value that ranges from 0 to 1 where:",[72,50809,50810,50813],{},[46,50811,50812],{},"Lower temperatures (lower than 0.5) result in output that's more predictable and appears more focused. The model tends to choose the most likely next word or token based on its training data, which is useful when you want answers that are more precise and reliable.",[46,50814,50815],{},"Higher temperatures (0.5 and higher) result in less predictable output that seems more random and creative. The model samples from a wider range of possible next words or tokens, including less likely ones, leading to more diverse and imaginative-seeming responses — but it also increases the chances of generating less coherent or less relevant text.",[19,50817,50818,50819,50822,50823,50825,50826,50829],{},"Copy the previous cell and add a ",[109,50820,50821],{},"'temperature'"," key to the ",[109,50824,49592],{}," dictionary with a value of ",[109,50827,50828],{},"1.0",". The code in the cell should look like this:",[102,50831,50833],{"className":26082,"code":50832,"language":26084,"meta":107,"style":107},"request = operations.CreateGenaiPromptRequest(\n    connection_id = CLAUDE_CONNECTION_ID,\n    genai_prompt = {\n        # New code 👇\n        'temperature' : 1.0,\n        # New code 👆\n        'messages' : [\n            {\n                'role': 'system',\n                'content': \"Provide answers as if you were a carnival barker.\"\n            },\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request=request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[109,50834,50835,50843,50853,50861,50866,50878,50883,50889,50893,50903,50911,50915,50919,50929,50937,50941,50945,50949,50953,50967,50971,50985,50991,50997],{"__ignoreMap":107},[112,50836,50837,50839,50841],{"class":114,"line":115},[112,50838,49883],{"class":236},[112,50840,335],{"class":229},[112,50842,49430],{"class":236},[112,50844,50845,50847,50849,50851],{"class":114,"line":126},[112,50846,14810],{"class":517},[112,50848,354],{"class":229},[112,50850,49439],{"class":129},[112,50852,288],{"class":236},[112,50854,50855,50857,50859],{"class":114,"line":135},[112,50856,49446],{"class":517},[112,50858,354],{"class":229},[112,50860,280],{"class":236},[112,50862,50863],{"class":114,"line":147},[112,50864,50865],{"class":578},"        # New code 👇\n",[112,50867,50868,50871,50874,50876],{"class":114,"line":202},[112,50869,50870],{"class":122},"        'temperature'",[112,50872,50873],{"class":236}," : ",[112,50875,50828],{"class":129},[112,50877,288],{"class":236},[112,50879,50880],{"class":114,"line":208},[112,50881,50882],{"class":578},"        # New code 👆\n",[112,50884,50885,50887],{"class":114,"line":291},[112,50886,49455],{"class":122},[112,50888,49458],{"class":236},[112,50890,50891],{"class":114,"line":299},[112,50892,49463],{"class":236},[112,50894,50895,50897,50899,50901],{"class":114,"line":307},[112,50896,49468],{"class":122},[112,50898,2335],{"class":236},[112,50900,49617],{"class":122},[112,50902,288],{"class":236},[112,50904,50905,50907,50909],{"class":114,"line":315},[112,50906,49479],{"class":122},[112,50908,2335],{"class":236},[112,50910,50227],{"class":122},[112,50912,50913],{"class":114,"line":323},[112,50914,45946],{"class":236},[112,50916,50917],{"class":114,"line":329},[112,50918,49463],{"class":236},[112,50920,50921,50923,50925,50927],{"class":114,"line":341},[112,50922,49468],{"class":122},[112,50924,2335],{"class":236},[112,50926,20061],{"class":122},[112,50928,288],{"class":236},[112,50930,50931,50933,50935],{"class":114,"line":346},[112,50932,49479],{"class":122},[112,50934,2335],{"class":236},[112,50936,49484],{"class":122},[112,50938,50939],{"class":114,"line":366},[112,50940,28745],{"class":236},[112,50942,50943],{"class":114,"line":381},[112,50944,49493],{"class":236},[112,50946,50947],{"class":114,"line":387},[112,50948,3946],{"class":236},[112,50950,50951],{"class":114,"line":392},[112,50952,15267],{"class":236},[112,50954,50955,50957,50959,50961,50963,50965],{"class":114,"line":409},[112,50956,27079],{"class":236},[112,50958,335],{"class":229},[112,50960,49510],{"class":236},[112,50962,33255],{"class":517},[112,50964,335],{"class":229},[112,50966,50289],{"class":236},[112,50968,50969],{"class":114,"line":422},[112,50970,272],{"emptyLinePlaceholder":271},[112,50972,50973,50975,50977,50979,50981,50983],{"class":114,"line":435},[112,50974,26505],{"class":229},[112,50976,49528],{"class":236},[112,50978,49531],{"class":229},[112,50980,49534],{"class":229},[112,50982,49537],{"class":129},[112,50984,43327],{"class":236},[112,50986,50987,50989],{"class":114,"line":440},[112,50988,29335],{"class":129},[112,50990,49546],{"class":236},[112,50992,50993,50995],{"class":114,"line":4949},[112,50994,14616],{"class":229},[112,50996,43327],{"class":236},[112,50998,50999,51001,51003,51005],{"class":114,"line":4960},[112,51000,29335],{"class":129},[112,51002,456],{"class":236},[112,51004,49561],{"class":122},[112,51006,15267],{"class":236},[19,51008,51009],{},"With a temperature of 1.0, Claude should produce a differently-worded response each time you run the cell.",[19,51011,51012,51013,51015,51016,634],{},"You can try the same thing with OpenAI simply by changing the value of the ",[109,51014,2886],{}," parameter to ",[109,51017,49331],{},[67,51019,51021],{"id":51020},"work-with-different-llm-models","Work with different LLM models",[19,51023,51024],{},"Many of the AIs that Unified.to's GenAI API can access provide a choice of models that vary in complexity and cost, where the more complex ones typically provide much better answers, but at a higher per-use price. The AI vendors are constantly adding newer LLM models and retiring older ones, so it's helpful to query the AI to find out which models it currently offers.",[19,51026,51027],{},[478,51028,51029],{},"Get a list of the current LLM model IDs",[19,51031,51032],{},"Create a new cell, enter the following code into it, and run it:",[102,51034,51036],{"className":26082,"code":51035,"language":26084,"meta":107,"style":107},"request = operations.ListGenaiModelsRequest(\n    connection_id = OPENAI_CONNECTION_ID\n)\nresponse = api.genai.list_genai_models(request)\nprint(sorted([model.id for model in response.genai_models]))\n",[109,51037,51038,51047,51056,51060,51069],{"__ignoreMap":107},[112,51039,51040,51042,51044],{"class":114,"line":115},[112,51041,49883],{"class":236},[112,51043,335],{"class":229},[112,51045,51046],{"class":236}," operations.ListGenaiModelsRequest(\n",[112,51048,51049,51051,51053],{"class":114,"line":126},[112,51050,14810],{"class":517},[112,51052,354],{"class":229},[112,51054,51055],{"class":129}," OPENAI_CONNECTION_ID\n",[112,51057,51058],{"class":114,"line":135},[112,51059,15267],{"class":236},[112,51061,51062,51064,51066],{"class":114,"line":147},[112,51063,27079],{"class":236},[112,51065,335],{"class":229},[112,51067,51068],{"class":236}," api.genai.list_genai_models(request)\n",[112,51070,51071,51073,51075,51078,51081,51083,51086,51088],{"class":114,"line":202},[112,51072,29261],{"class":129},[112,51074,456],{"class":236},[112,51076,51077],{"class":129},"sorted",[112,51079,51080],{"class":236},"([model.id ",[112,51082,27581],{"class":229},[112,51084,51085],{"class":236}," model ",[112,51087,29282],{"class":229},[112,51089,51090],{"class":236}," response.genai_models]))\n",[19,51092,51093,51094,51097,51098,51101],{},"This code uses the ",[1614,51095,1640],{"href":1638,"rel":51096},[1618]," Python SDK's ",[109,51099,51100],{},"genai.list_genai_models()"," method to get a list of objects describing the models offered by OpenAI and outputs a sorted list of their IDs. At the time of writing, the result looked like this (formatted for easier reading):",[102,51103,51105],{"className":26082,"code":51104,"language":26084,"meta":107,"style":107},"[\n    'babbage-002', \n    'dall-e-2', \n    'dall-e-3', \n    'davinci-002', \n    'gpt-3.5-turbo', \n    'gpt-3.5-turbo-0125', \n    'gpt-3.5-turbo-0301', \n    'gpt-3.5-turbo-0613', \n    'gpt-3.5-turbo-1106', \n    'gpt-3.5-turbo-16k', \n    'gpt-3.5-turbo-16k-0613', \n    'gpt-3.5-turbo-instruct', \n    'gpt-3.5-turbo-instruct-0914', \n    'gpt-4', \n    'gpt-4-0125-preview', \n    'gpt-4-0613', \n    'gpt-4-1106-preview', \n    'gpt-4-1106-vision-preview', \n    'gpt-4-turbo', \n    'gpt-4-turbo-2024-04-09', \n    'gpt-4-turbo-preview', \n    'gpt-4-vision-preview', \n    'gpt-4o', \n    'gpt-4o-2024-05-13', \n    'text-embedding-3-large', \n    'text-embedding-3-small', \n    'text-embedding-ada-002', \n    'tts-1', \n    'tts-1-1106', \n    'tts-1-hd', \n    'tts-1-hd-1106', \n    'whisper-1'\n]\n",[109,51106,51107,51111,51118,51125,51132,51139,51146,51153,51160,51167,51174,51181,51188,51195,51202,51209,51216,51223,51230,51237,51244,51251,51258,51265,51272,51279,51286,51293,51300,51307,51314,51321,51328,51333],{"__ignoreMap":107},[112,51108,51109],{"class":114,"line":115},[112,51110,2728],{"class":236},[112,51112,51113,51116],{"class":114,"line":126},[112,51114,51115],{"class":122},"    'babbage-002'",[112,51117,21797],{"class":236},[112,51119,51120,51123],{"class":114,"line":135},[112,51121,51122],{"class":122},"    'dall-e-2'",[112,51124,21797],{"class":236},[112,51126,51127,51130],{"class":114,"line":147},[112,51128,51129],{"class":122},"    'dall-e-3'",[112,51131,21797],{"class":236},[112,51133,51134,51137],{"class":114,"line":202},[112,51135,51136],{"class":122},"    'davinci-002'",[112,51138,21797],{"class":236},[112,51140,51141,51144],{"class":114,"line":208},[112,51142,51143],{"class":122},"    'gpt-3.5-turbo'",[112,51145,21797],{"class":236},[112,51147,51148,51151],{"class":114,"line":291},[112,51149,51150],{"class":122},"    'gpt-3.5-turbo-0125'",[112,51152,21797],{"class":236},[112,51154,51155,51158],{"class":114,"line":299},[112,51156,51157],{"class":122},"    'gpt-3.5-turbo-0301'",[112,51159,21797],{"class":236},[112,51161,51162,51165],{"class":114,"line":307},[112,51163,51164],{"class":122},"    'gpt-3.5-turbo-0613'",[112,51166,21797],{"class":236},[112,51168,51169,51172],{"class":114,"line":315},[112,51170,51171],{"class":122},"    'gpt-3.5-turbo-1106'",[112,51173,21797],{"class":236},[112,51175,51176,51179],{"class":114,"line":323},[112,51177,51178],{"class":122},"    'gpt-3.5-turbo-16k'",[112,51180,21797],{"class":236},[112,51182,51183,51186],{"class":114,"line":329},[112,51184,51185],{"class":122},"    'gpt-3.5-turbo-16k-0613'",[112,51187,21797],{"class":236},[112,51189,51190,51193],{"class":114,"line":341},[112,51191,51192],{"class":122},"    'gpt-3.5-turbo-instruct'",[112,51194,21797],{"class":236},[112,51196,51197,51200],{"class":114,"line":346},[112,51198,51199],{"class":122},"    'gpt-3.5-turbo-instruct-0914'",[112,51201,21797],{"class":236},[112,51203,51204,51207],{"class":114,"line":366},[112,51205,51206],{"class":122},"    'gpt-4'",[112,51208,21797],{"class":236},[112,51210,51211,51214],{"class":114,"line":381},[112,51212,51213],{"class":122},"    'gpt-4-0125-preview'",[112,51215,21797],{"class":236},[112,51217,51218,51221],{"class":114,"line":387},[112,51219,51220],{"class":122},"    'gpt-4-0613'",[112,51222,21797],{"class":236},[112,51224,51225,51228],{"class":114,"line":392},[112,51226,51227],{"class":122},"    'gpt-4-1106-preview'",[112,51229,21797],{"class":236},[112,51231,51232,51235],{"class":114,"line":409},[112,51233,51234],{"class":122},"    'gpt-4-1106-vision-preview'",[112,51236,21797],{"class":236},[112,51238,51239,51242],{"class":114,"line":422},[112,51240,51241],{"class":122},"    'gpt-4-turbo'",[112,51243,21797],{"class":236},[112,51245,51246,51249],{"class":114,"line":435},[112,51247,51248],{"class":122},"    'gpt-4-turbo-2024-04-09'",[112,51250,21797],{"class":236},[112,51252,51253,51256],{"class":114,"line":440},[112,51254,51255],{"class":122},"    'gpt-4-turbo-preview'",[112,51257,21797],{"class":236},[112,51259,51260,51263],{"class":114,"line":4949},[112,51261,51262],{"class":122},"    'gpt-4-vision-preview'",[112,51264,21797],{"class":236},[112,51266,51267,51270],{"class":114,"line":4960},[112,51268,51269],{"class":122},"    'gpt-4o'",[112,51271,21797],{"class":236},[112,51273,51274,51277],{"class":114,"line":4972},[112,51275,51276],{"class":122},"    'gpt-4o-2024-05-13'",[112,51278,21797],{"class":236},[112,51280,51281,51284],{"class":114,"line":4984},[112,51282,51283],{"class":122},"    'text-embedding-3-large'",[112,51285,21797],{"class":236},[112,51287,51288,51291],{"class":114,"line":4992},[112,51289,51290],{"class":122},"    'text-embedding-3-small'",[112,51292,21797],{"class":236},[112,51294,51295,51298],{"class":114,"line":5000},[112,51296,51297],{"class":122},"    'text-embedding-ada-002'",[112,51299,21797],{"class":236},[112,51301,51302,51305],{"class":114,"line":5008},[112,51303,51304],{"class":122},"    'tts-1'",[112,51306,21797],{"class":236},[112,51308,51309,51312],{"class":114,"line":5016},[112,51310,51311],{"class":122},"    'tts-1-1106'",[112,51313,21797],{"class":236},[112,51315,51316,51319],{"class":114,"line":5024},[112,51317,51318],{"class":122},"    'tts-1-hd'",[112,51320,21797],{"class":236},[112,51322,51323,51326],{"class":114,"line":5032},[112,51324,51325],{"class":122},"    'tts-1-hd-1106'",[112,51327,21797],{"class":236},[112,51329,51330],{"class":114,"line":5040},[112,51331,51332],{"class":122},"    'whisper-1'\n",[112,51334,51335],{"class":114,"line":5046},[112,51336,2794],{"class":236},[19,51338,51339,51340,51342,51343,51345],{},"You can do the same for Claude simply by changing ",[109,51341,2886],{},"'s value to ",[109,51344,49345],{},". The resulting output looks like this (formatted for easier reading):",[102,51347,51349],{"className":26082,"code":51348,"language":26084,"meta":107,"style":107},"[\n    'claude-2.0', \n    'claude-2.1', \n    'claude-3-haiku-20240307', \n    'claude-3-opus-20240229', \n    'claude-3-sonnet-20240229', \n    'claude-instant-1.2'\n]\n",[109,51350,51351,51355,51362,51369,51376,51383,51390,51395],{"__ignoreMap":107},[112,51352,51353],{"class":114,"line":115},[112,51354,2728],{"class":236},[112,51356,51357,51360],{"class":114,"line":126},[112,51358,51359],{"class":122},"    'claude-2.0'",[112,51361,21797],{"class":236},[112,51363,51364,51367],{"class":114,"line":135},[112,51365,51366],{"class":122},"    'claude-2.1'",[112,51368,21797],{"class":236},[112,51370,51371,51374],{"class":114,"line":147},[112,51372,51373],{"class":122},"    'claude-3-haiku-20240307'",[112,51375,21797],{"class":236},[112,51377,51378,51381],{"class":114,"line":202},[112,51379,51380],{"class":122},"    'claude-3-opus-20240229'",[112,51382,21797],{"class":236},[112,51384,51385,51388],{"class":114,"line":208},[112,51386,51387],{"class":122},"    'claude-3-sonnet-20240229'",[112,51389,21797],{"class":236},[112,51391,51392],{"class":114,"line":291},[112,51393,51394],{"class":122},"    'claude-instant-1.2'\n",[112,51396,51397],{"class":114,"line":299},[112,51398,2794],{"class":236},[19,51400,51401],{},[478,51402,51403],{},"Talk to different OpenAI models",[19,51405,51406],{},"Run this code in a new cell:",[102,51408,51410],{"className":26082,"code":51409,"language":26084,"meta":107,"style":107},"def ask_ai_which_model(my_connection_id, my_model_id):\n    request = operations.CreateGenaiPromptRequest(\n        connection_id = my_connection_id,\n        genai_prompt = {\n            'model_id' : my_model_id,\n            'messages' : [\n                {\n                    'role': 'user',\n                    'content': \"Which LLM model am I talking to right now?\"\n                }\n            ]\n        }\n    )\n    response = api.genai.create_genai_prompt(request)\n\n    if response.genai_prompt is not None:\n        print(f\"{model_id}: {response.genai_prompt.responses}\\n\")\n    else:\n        print(\"No response.\")\n",[109,51411,51412,51423,51432,51442,51451,51459,51466,51471,51482,51491,51495,51500,51504,51508,51517,51521,51535,51567,51574],{"__ignoreMap":107},[112,51413,51414,51417,51420],{"class":114,"line":115},[112,51415,51416],{"class":229},"def",[112,51418,51419],{"class":118}," ask_ai_which_model",[112,51421,51422],{"class":236},"(my_connection_id, my_model_id):\n",[112,51424,51425,51428,51430],{"class":114,"line":126},[112,51426,51427],{"class":236},"    request ",[112,51429,335],{"class":229},[112,51431,49430],{"class":236},[112,51433,51434,51437,51439],{"class":114,"line":135},[112,51435,51436],{"class":517},"        connection_id",[112,51438,354],{"class":229},[112,51440,51441],{"class":236}," my_connection_id,\n",[112,51443,51444,51447,51449],{"class":114,"line":147},[112,51445,51446],{"class":517},"        genai_prompt",[112,51448,354],{"class":229},[112,51450,280],{"class":236},[112,51452,51453,51456],{"class":114,"line":202},[112,51454,51455],{"class":122},"            'model_id'",[112,51457,51458],{"class":236}," : my_model_id,\n",[112,51460,51461,51464],{"class":114,"line":208},[112,51462,51463],{"class":122},"            'messages'",[112,51465,49458],{"class":236},[112,51467,51468],{"class":114,"line":291},[112,51469,51470],{"class":236},"                {\n",[112,51472,51473,51476,51478,51480],{"class":114,"line":299},[112,51474,51475],{"class":122},"                    'role'",[112,51477,2335],{"class":236},[112,51479,20061],{"class":122},[112,51481,288],{"class":236},[112,51483,51484,51487,51489],{"class":114,"line":307},[112,51485,51486],{"class":122},"                    'content'",[112,51488,2335],{"class":236},[112,51490,49484],{"class":122},[112,51492,51493],{"class":114,"line":315},[112,51494,45986],{"class":236},[112,51496,51497],{"class":114,"line":323},[112,51498,51499],{"class":236},"            ]\n",[112,51501,51502],{"class":114,"line":329},[112,51503,4052],{"class":236},[112,51505,51506],{"class":114,"line":341},[112,51507,49792],{"class":236},[112,51509,51510,51513,51515],{"class":114,"line":346},[112,51511,51512],{"class":236},"    response ",[112,51514,335],{"class":229},[112,51516,49958],{"class":236},[112,51518,51519],{"class":114,"line":366},[112,51520,272],{"emptyLinePlaceholder":271},[112,51522,51523,51525,51527,51529,51531,51533],{"class":114,"line":381},[112,51524,15209],{"class":229},[112,51526,49528],{"class":236},[112,51528,49531],{"class":229},[112,51530,49534],{"class":229},[112,51532,49537],{"class":129},[112,51534,43327],{"class":236},[112,51536,51537,51540,51542,51545,51547,51549,51552,51554,51556,51558,51560,51563,51565],{"class":114,"line":387},[112,51538,51539],{"class":129},"        print",[112,51541,456],{"class":236},[112,51543,51544],{"class":229},"f",[112,51546,33910],{"class":122},[112,51548,17245],{"class":129},[112,51550,51551],{"class":236},"model_id",[112,51553,47086],{"class":129},[112,51555,2335],{"class":122},[112,51557,17245],{"class":129},[112,51559,50459],{"class":236},[112,51561,51562],{"class":129},"}\\n",[112,51564,33910],{"class":122},[112,51566,15267],{"class":236},[112,51568,51569,51572],{"class":114,"line":392},[112,51570,51571],{"class":229},"    else",[112,51573,43327],{"class":236},[112,51575,51576,51578,51580,51582],{"class":114,"line":409},[112,51577,51539],{"class":129},[112,51579,456],{"class":236},[112,51581,49561],{"class":122},[112,51583,15267],{"class":236},[19,51585,51586,51587,51590],{},"This defines the ",[109,51588,51589],{},"ask_ai_which_model()"," method, which will make it simpler to send the same prompt to different AIs and models.",[19,51592,51593],{},"Enter the following into a new cell:",[102,51595,51597],{"className":26082,"code":51596,"language":26084,"meta":107,"style":107},"model_ids = ['gpt-3.5-turbo', 'gpt-4o']\n\nfor model_id in model_ids:\n    ask_ai_which_model(OPENAI_CONNECTION_ID, model_id)\n",[109,51598,51599,51618,51622,51634],{"__ignoreMap":107},[112,51600,51601,51604,51606,51608,51611,51613,51616],{"class":114,"line":115},[112,51602,51603],{"class":236},"model_ids ",[112,51605,335],{"class":229},[112,51607,26422],{"class":236},[112,51609,51610],{"class":122},"'gpt-3.5-turbo'",[112,51612,1046],{"class":236},[112,51614,51615],{"class":122},"'gpt-4o'",[112,51617,2794],{"class":236},[112,51619,51620],{"class":114,"line":126},[112,51621,272],{"emptyLinePlaceholder":271},[112,51623,51624,51626,51629,51631],{"class":114,"line":135},[112,51625,27581],{"class":229},[112,51627,51628],{"class":236}," model_id ",[112,51630,29282],{"class":229},[112,51632,51633],{"class":236}," model_ids:\n",[112,51635,51636,51639,51641],{"class":114,"line":147},[112,51637,51638],{"class":236},"    ask_ai_which_model(",[112,51640,49331],{"class":129},[112,51642,51643],{"class":236},", model_id)\n",[19,51645,51646,51647,51650,51651,51654,51655,51658,51659,51661],{},"This code sends the same prompt, 'Which LLM model am I talking to right now?' to two different OpenAI models, ",[478,51648,51649],{},"gpt-3.5-turbo"," and the new ",[478,51652,51653],{},"gpt-4o",". It specifies which model to use with the ",[109,51656,51657],{},"'model_id'"," key in the ",[109,51660,49592],{}," dictionary. Here's its output:",[102,51663,51665],{"className":26082,"code":51664,"language":26084,"meta":107,"style":107},"gpt-3.5-turbo: ['I am GPT-3, a language model developed by OpenAI.']\n\ngpt-4o: [\"You are interacting with a model based on OpenAI's GPT-4. How can I assist you today?\"]\n",[109,51666,51667,51687,51691],{"__ignoreMap":107},[112,51668,51669,51672,51674,51677,51679,51682,51685],{"class":114,"line":115},[112,51670,51671],{"class":236},"gpt",[112,51673,23301],{"class":229},[112,51675,51676],{"class":129},"3.5",[112,51678,23301],{"class":229},[112,51680,51681],{"class":236},"turbo: [",[112,51683,51684],{"class":122},"'I am GPT-3, a language model developed by OpenAI.'",[112,51686,2794],{"class":236},[112,51688,51689],{"class":114,"line":126},[112,51690,272],{"emptyLinePlaceholder":271},[112,51692,51693,51695,51697,51700,51702,51705],{"class":114,"line":135},[112,51694,51671],{"class":236},[112,51696,23301],{"class":229},[112,51698,51699],{"class":2885},"4o",[112,51701,3903],{"class":236},[112,51703,51704],{"class":122},"\"You are interacting with a model based on OpenAI's GPT-4. How can I assist you today?\"",[112,51706,2794],{"class":236},[19,51708,51709],{},"Let's try it with Claude. Enter the following into a new cell:",[102,51711,51713],{"className":26082,"code":51712,"language":26084,"meta":107,"style":107},"model_ids = ['claude-3-sonnet-20240229', 'claude-3-opus-20240229']\n\nfor model_id in model_ids:\n    ask_ai_which_model(CLAUDE_CONNECTION_ID, model_id)\n",[109,51714,51715,51733,51737,51747],{"__ignoreMap":107},[112,51716,51717,51719,51721,51723,51726,51728,51731],{"class":114,"line":115},[112,51718,51603],{"class":236},[112,51720,335],{"class":229},[112,51722,26422],{"class":236},[112,51724,51725],{"class":122},"'claude-3-sonnet-20240229'",[112,51727,1046],{"class":236},[112,51729,51730],{"class":122},"'claude-3-opus-20240229'",[112,51732,2794],{"class":236},[112,51734,51735],{"class":114,"line":126},[112,51736,272],{"emptyLinePlaceholder":271},[112,51738,51739,51741,51743,51745],{"class":114,"line":135},[112,51740,27581],{"class":229},[112,51742,51628],{"class":236},[112,51744,29282],{"class":229},[112,51746,51633],{"class":236},[112,51748,51749,51751,51753],{"class":114,"line":147},[112,51750,51638],{"class":236},[112,51752,49345],{"class":129},[112,51754,51643],{"class":236},[19,51756,51757,51758,11338,51761,51764],{},"This code sends the 'Which LLM model am I talking to right now?' to two different Claude models, the currently available ",[478,51759,51760],{},"sonnet",[478,51762,51763],{},"opus"," models. Here's its output:",[102,51766,51768],{"className":26082,"code":51767,"language":26084,"meta":107,"style":107},"claude-3-sonnet-20240229: [\"I am an AI assistant created by Anthropic, but I'm not sure which specific model I am. I don't have full information about the technical details of my architecture or training process.\"]\n\nclaude-3-opus-20240229: ['I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.']\n",[109,51769,51770,51795,51799],{"__ignoreMap":107},[112,51771,51772,51775,51777,51779,51781,51783,51785,51788,51790,51793],{"class":114,"line":115},[112,51773,51774],{"class":236},"claude",[112,51776,23301],{"class":229},[112,51778,25023],{"class":129},[112,51780,23301],{"class":229},[112,51782,51760],{"class":236},[112,51784,23301],{"class":229},[112,51786,51787],{"class":129},"20240229",[112,51789,3903],{"class":236},[112,51791,51792],{"class":122},"\"I am an AI assistant created by Anthropic, but I'm not sure which specific model I am. I don't have full information about the technical details of my architecture or training process.\"",[112,51794,2794],{"class":236},[112,51796,51797],{"class":114,"line":126},[112,51798,272],{"emptyLinePlaceholder":271},[112,51800,51801,51803,51805,51807,51809,51811,51813,51815,51817,51819],{"class":114,"line":135},[112,51802,51774],{"class":236},[112,51804,23301],{"class":229},[112,51806,25023],{"class":129},[112,51808,23301],{"class":229},[112,51810,51763],{"class":236},[112,51812,23301],{"class":229},[112,51814,51787],{"class":129},[112,51816,3903],{"class":236},[112,51818,49774],{"class":122},[112,51820,2794],{"class":236},[67,51822,10173],{"id":10172},[19,51824,51825],{},"While our unified GenAI API greatly simplifies the process of calling on various generative AI services, and leverage your customer's APi keys on those AI vendors, its real power comes from using it to process data from our other APIs, which integrate with an array of SaaS application categories, including:",[72,51827,51828,51834,51840,51846],{},[46,51829,51830,51833],{},[478,51831,51832],{},"ATS (Applicant Tracking System):"," Use AI to analyze documents that job applicants provide, such as their resume or cover letter, as well interviewer notes and scorecard comments.",[46,51835,51836,51839],{},[478,51837,51838],{},"KMS (Knowledge Management System):"," Find lost knowledge, convert text data into structured data, summarize meeting minutes, and gain new insights by harnessing an LLM to analyze knowledge systems, wikis, and other planning applications.",[46,51841,51842,51845],{},[478,51843,51844],{},"Messaging:"," Our Messaging API can retrieve emails and chat messages, and when combined with AI, can be used to do things like construct a record of a project, create a timeline of an ongoing discussion, identify incomplete tasks, and more.",[46,51847,51848,51851],{},[478,51849,51850],{},"Storage:"," Get files and documents from popular cloud storage systems and combine them with an LLM to generate reports, documentation, how-to guides, etc.",[67,51853,51855],{"id":51854},"try-our-genai-api-now","Try our GenAI API now",[19,51857,51858],{},"Our unified GenAI API is available on all Unified.to workspaces on every plan — even our free one. Once you've created your Unified.to account, you can activate integrations in seconds and start building applications that leverage our GenAI integrations.",[19,51860,51861,51862,634],{},"See how easy it is to use our real-time unified API by signing up for our free 30-day unlimited-use ",[1614,51863,51865],{"href":12214,"rel":51864},[1618],[478,51866,48888],{},[1558,51868,51869],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}",{"title":107,"searchDepth":126,"depth":126,"links":51871},[51872,51873,51874,51875,51876,51877,51878,51879,51880,51881],{"id":48925,"depth":126,"text":48926},{"id":49020,"depth":126,"text":49021},{"id":49126,"depth":126,"text":49127},{"id":49147,"depth":126,"text":49148},{"id":49198,"depth":126,"text":49199},{"id":49229,"depth":126,"text":49230},{"id":50799,"depth":126,"text":50800},{"id":51020,"depth":126,"text":51021},{"id":10172,"depth":126,"text":10173},{"id":51854,"depth":126,"text":51855},"This guide shows you how to get started with Unified.to's GenAI (generative AI) API, which provides a unified model and API for interacting with large language...",{"img":51884,"date":51885,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-icon.png","2024-05-29T00:00:00.000Z","/guides/how_to_use_unified_generative_ai_api_with_openai_and_claude",{"title":48806,"description":51882},"guides/how_to_use_unified_generative_ai_api_with_openai_and_claude","N7uf32UkQaGyRlgaGTTP11DtGKiFq2DeHEZyqHaNE9E",{"id":51891,"title":51892,"body":51893,"description":52891,"extension":1576,"meta":52892,"navigation":271,"path":52895,"seo":52896,"stem":52897,"__hash__":52898},"guides/guides/how_to_use_user_provisioning_and_verification_with_unified.md","How to use User Provisioning and Verification with Unified",{"type":9,"value":51894,"toc":52878},[51895,51898,51900,51905,51909,51912,51915,51917,51929,51933,51936,51942,51949,51951,51953,51989,51993,52012,52014,52016,52101,52103,52105,52108,52111,52113,52117,52261,52263,52267,52341,52343,52347,52445,52447,52451,52539,52541,52545,52548,52625,52627,52629,52871,52873,52876],[12,51896,51892],{"id":51897},"how-to-use-user-provisioning-and-verification-with-unified",[16,51899],{},[19,51901,51902],{},[22,51903,51904],{},"August 10, 2025",[12,51906,51908],{"id":51907},"user-provisioning-and-verification-with-unified","User Provisioning and Verification with Unified",[19,51910,51911],{},"With Unified's SCIM API devs can build use provisioning features that work with any HRIS integration like BambooHR, Workday and any other ATS integration that Unified connects to. You can create, update, list and delete users in your customers employee directories.",[19,51913,51914],{},"In this guide, I will show you how to provision users using the SDK, with BambooHR as an example. The same approach works for all Unified HR integrations.",[67,51916,70],{"id":69},[72,51918,51919,51921,51924,51926],{},[46,51920,76],{},[46,51922,51923],{},"Unified account with at least one HR integration enabled (e.g. for this example we are using BambooHR)",[46,51925,82],{},[46,51927,51928],{},"Your customer's HR connection ID",[67,51930,51932],{"id":51931},"supported-integrations","Supported Integrations",[19,51934,51935],{},"Unified's API works with 170+ HR integrations (BambooHR, Workday, HiBob, Gusto, etc.) and 5+ verification providers (Certn, Checkr, First Advantage, Verifiable, Yardstik).",[19,51937,51938],{},[1614,51939,51941],{"href":12914,"rel":51940},[1618],"See all HR integrations",[19,51943,51944],{},[1614,51945,51948],{"href":51946,"rel":51947},"https://docs.unified.to/verification/integrations",[1618],"See all verification integrations",[16,51950],{},[67,51952,97],{"id":96},[102,51954,51956],{"className":104,"code":51955,"language":106,"meta":107,"style":107},"mkdir user-verification-demo\ncd user-verification-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[109,51957,51958,51965,51971,51979],{"__ignoreMap":107},[112,51959,51960,51962],{"class":114,"line":115},[112,51961,119],{"class":118},[112,51963,51964],{"class":122}," user-verification-demo\n",[112,51966,51967,51969],{"class":114,"line":126},[112,51968,130],{"class":129},[112,51970,51964],{"class":122},[112,51972,51973,51975,51977],{"class":114,"line":135},[112,51974,138],{"class":118},[112,51976,141],{"class":122},[112,51978,144],{"class":129},[112,51980,51981,51983,51985,51987],{"class":114,"line":147},[112,51982,138],{"class":118},[112,51984,152],{"class":122},[112,51986,155],{"class":122},[112,51988,20588],{"class":122},[19,51990,167,51991,171],{},[109,51992,170],{},[102,51994,51996],{"className":174,"code":51995,"language":176,"meta":177,"style":107},"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_BAMBOOHR=your_customer_bamboohr_connection_id\nCONNECTION_VERIFICATION=your_customer_verification_connection_id\n",[109,51997,51998,52002,52007],{"__ignoreMap":107},[112,51999,52000],{"class":114,"line":115},[112,52001,184],{},[112,52003,52004],{"class":114,"line":126},[112,52005,52006],{},"CONNECTION_BAMBOOHR=your_customer_bamboohr_connection_id\n",[112,52008,52009],{"class":114,"line":135},[112,52010,52011],{},"CONNECTION_VERIFICATION=your_customer_verification_connection_id\n",[16,52013],{},[67,52015,20612],{"id":20611},[102,52017,52019],{"className":220,"code":52018,"language":222,"meta":107,"style":107},"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_BAMBOOHR, CONNECTION_VERIFICATION } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[109,52020,52021,52029,52041,52045,52069,52073,52087,52097],{"__ignoreMap":107},[112,52022,52023,52025,52027],{"class":114,"line":115},[112,52024,230],{"class":229},[112,52026,233],{"class":122},[112,52028,237],{"class":236},[112,52030,52031,52033,52035,52037,52039],{"class":114,"line":126},[112,52032,230],{"class":229},[112,52034,244],{"class":236},[112,52036,247],{"class":229},[112,52038,250],{"class":122},[112,52040,237],{"class":236},[112,52042,52043],{"class":114,"line":135},[112,52044,272],{"emptyLinePlaceholder":271},[112,52046,52047,52049,52051,52053,52055,52058,52060,52063,52065,52067],{"class":114,"line":147},[112,52048,277],{"class":229},[112,52050,18780],{"class":236},[112,52052,372],{"class":129},[112,52054,1046],{"class":236},[112,52056,52057],{"class":129},"CONNECTION_BAMBOOHR",[112,52059,1046],{"class":236},[112,52061,52062],{"class":129},"CONNECTION_VERIFICATION",[112,52064,18801],{"class":236},[112,52066,335],{"class":229},[112,52068,338],{"class":236},[112,52070,52071],{"class":114,"line":202},[112,52072,272],{"emptyLinePlaceholder":271},[112,52074,52075,52077,52079,52081,52083,52085],{"class":114,"line":208},[112,52076,277],{"class":229},[112,52078,351],{"class":129},[112,52080,354],{"class":229},[112,52082,357],{"class":229},[112,52084,360],{"class":118},[112,52086,363],{"class":236},[112,52088,52089,52091,52093,52095],{"class":114,"line":291},[112,52090,369],{"class":236},[112,52092,372],{"class":129},[112,52094,375],{"class":229},[112,52096,378],{"class":236},[112,52098,52099],{"class":114,"line":299},[112,52100,384],{"class":236},[16,52102],{},[67,52104,470],{"id":469},[19,52106,52107],{},"Before you get started, your end customer must authorize your app to access their HRIs integration via Unified's auth flow.",[19,52109,52110],{},"Once authorized, you will receive a connection ID for that customer's integration. Store this carefully and use it in all API calls for that specific customer.",[16,52112],{},[67,52114,52116],{"id":52115},"step-4-creating-a-user-provisioning","Step 4: Creating a User (Provisioning)",[102,52118,52120],{"className":220,"code":52119,"language":222,"meta":107,"style":107},"export async function createUser(connectionId: string, email: string, firstName: string, lastName: string) {\n  const employee = await sdk.hris.createHrisEmployee({\n    connectionId,\n    hrisEmployee: {\n      name: `${firstName} ${lastName}`,\n      emails: [{ email }],\n      firstName,\n      lastName,\n      employmentStatus: \"ACTIVE\",\n    },\n  });\n  return employee; // HrisEmployee\n}\n",[109,52121,52122,52169,52187,52191,52196,52214,52219,52224,52229,52239,52243,52247,52257],{"__ignoreMap":107},[112,52123,52124,52126,52128,52130,52133,52135,52137,52139,52141,52143,52145,52147,52149,52151,52154,52156,52158,52160,52163,52165,52167],{"class":114,"line":115},[112,52125,503],{"class":229},[112,52127,506],{"class":229},[112,52129,509],{"class":229},[112,52131,52132],{"class":118}," createUser",[112,52134,456],{"class":236},[112,52136,518],{"class":517},[112,52138,171],{"class":229},[112,52140,523],{"class":129},[112,52142,1046],{"class":236},[112,52144,666],{"class":517},[112,52146,171],{"class":229},[112,52148,523],{"class":129},[112,52150,1046],{"class":236},[112,52152,52153],{"class":517},"firstName",[112,52155,171],{"class":229},[112,52157,523],{"class":129},[112,52159,1046],{"class":236},[112,52161,52162],{"class":517},"lastName",[112,52164,171],{"class":229},[112,52166,523],{"class":129},[112,52168,526],{"class":236},[112,52170,52171,52173,52176,52178,52180,52182,52185],{"class":114,"line":126},[112,52172,531],{"class":229},[112,52174,52175],{"class":129}," employee",[112,52177,354],{"class":229},[112,52179,539],{"class":229},[112,52181,15863],{"class":236},[112,52183,52184],{"class":118},"createHrisEmployee",[112,52186,363],{"class":236},[112,52188,52189],{"class":114,"line":135},[112,52190,552],{"class":236},[112,52192,52193],{"class":114,"line":147},[112,52194,52195],{"class":236},"    hrisEmployee: {\n",[112,52197,52198,52201,52203,52205,52208,52210,52212],{"class":114,"line":202},[112,52199,52200],{"class":236},"      name: ",[112,52202,26816],{"class":122},[112,52204,52153],{"class":236},[112,52206,52207],{"class":122},"} ${",[112,52209,52162],{"class":236},[112,52211,640],{"class":122},[112,52213,288],{"class":236},[112,52215,52216],{"class":114,"line":208},[112,52217,52218],{"class":236},"      emails: [{ email }],\n",[112,52220,52221],{"class":114,"line":291},[112,52222,52223],{"class":236},"      firstName,\n",[112,52225,52226],{"class":114,"line":299},[112,52227,52228],{"class":236},"      lastName,\n",[112,52230,52231,52234,52237],{"class":114,"line":307},[112,52232,52233],{"class":236},"      employmentStatus: ",[112,52235,52236],{"class":122},"\"ACTIVE\"",[112,52238,288],{"class":236},[112,52240,52241],{"class":114,"line":315},[112,52242,988],{"class":236},[112,52244,52245],{"class":114,"line":323},[112,52246,567],{"class":236},[112,52248,52249,52251,52254],{"class":114,"line":329},[112,52250,621],{"class":229},[112,52252,52253],{"class":236}," employee; ",[112,52255,52256],{"class":578},"// HrisEmployee\n",[112,52258,52259],{"class":114,"line":341},[112,52260,584],{"class":236},[16,52262],{},[67,52264,52266],{"id":52265},"step-5-listing-users","Step 5: Listing Users",[102,52268,52270],{"className":220,"code":52269,"language":222,"meta":107,"style":107},"export async function listUsers(connectionId: string) {\n  const employees = await sdk.hris.listHrisEmployees({\n    connectionId,\n    limit: 10,\n  });\n  return employees; // HrisEmployee[]\n}\n",[109,52271,52272,52293,52311,52315,52323,52327,52337],{"__ignoreMap":107},[112,52273,52274,52276,52278,52280,52283,52285,52287,52289,52291],{"class":114,"line":115},[112,52275,503],{"class":229},[112,52277,506],{"class":229},[112,52279,509],{"class":229},[112,52281,52282],{"class":118}," listUsers",[112,52284,456],{"class":236},[112,52286,518],{"class":517},[112,52288,171],{"class":229},[112,52290,523],{"class":129},[112,52292,526],{"class":236},[112,52294,52295,52297,52300,52302,52304,52306,52309],{"class":114,"line":126},[112,52296,531],{"class":229},[112,52298,52299],{"class":129}," employees",[112,52301,354],{"class":229},[112,52303,539],{"class":229},[112,52305,15863],{"class":236},[112,52307,52308],{"class":118},"listHrisEmployees",[112,52310,363],{"class":236},[112,52312,52313],{"class":114,"line":135},[112,52314,552],{"class":236},[112,52316,52317,52319,52321],{"class":114,"line":147},[112,52318,557],{"class":236},[112,52320,560],{"class":129},[112,52322,288],{"class":236},[112,52324,52325],{"class":114,"line":202},[112,52326,567],{"class":236},[112,52328,52329,52331,52334],{"class":114,"line":208},[112,52330,621],{"class":229},[112,52332,52333],{"class":236}," employees; ",[112,52335,52336],{"class":578},"// HrisEmployee[]\n",[112,52338,52339],{"class":114,"line":291},[112,52340,584],{"class":236},[16,52342],{},[67,52344,52346],{"id":52345},"step-6-updating-a-user","Step 6: Updating a User",[102,52348,52350],{"className":220,"code":52349,"language":222,"meta":107,"style":107},"export async function updateUserStatus(connectionId: string, userId: string, status: \"ACTIVE\" | \"INACTIVE\") {\n  const updated = await sdk.hris.updateHrisEmployee({\n    connectionId,\n    id: userId,\n    hrisEmployee: { employmentStatus: status },\n  });\n  return updated; // HrisEmployee\n}\n",[109,52351,52352,52396,52414,52418,52423,52428,52432,52441],{"__ignoreMap":107},[112,52353,52354,52356,52358,52360,52363,52365,52367,52369,52371,52373,52376,52378,52380,52382,52384,52386,52389,52391,52394],{"class":114,"line":115},[112,52355,503],{"class":229},[112,52357,506],{"class":229},[112,52359,509],{"class":229},[112,52361,52362],{"class":118}," updateUserStatus",[112,52364,456],{"class":236},[112,52366,518],{"class":517},[112,52368,171],{"class":229},[112,52370,523],{"class":129},[112,52372,1046],{"class":236},[112,52374,52375],{"class":517},"userId",[112,52377,171],{"class":229},[112,52379,523],{"class":129},[112,52381,1046],{"class":236},[112,52383,11487],{"class":517},[112,52385,171],{"class":229},[112,52387,52388],{"class":122}," \"ACTIVE\"",[112,52390,10327],{"class":229},[112,52392,52393],{"class":122}," \"INACTIVE\"",[112,52395,526],{"class":236},[112,52397,52398,52400,52403,52405,52407,52409,52412],{"class":114,"line":126},[112,52399,531],{"class":229},[112,52401,52402],{"class":129}," updated",[112,52404,354],{"class":229},[112,52406,539],{"class":229},[112,52408,15863],{"class":236},[112,52410,52411],{"class":118},"updateHrisEmployee",[112,52413,363],{"class":236},[112,52415,52416],{"class":114,"line":135},[112,52417,552],{"class":236},[112,52419,52420],{"class":114,"line":147},[112,52421,52422],{"class":236},"    id: userId,\n",[112,52424,52425],{"class":114,"line":202},[112,52426,52427],{"class":236},"    hrisEmployee: { employmentStatus: status },\n",[112,52429,52430],{"class":114,"line":208},[112,52431,567],{"class":236},[112,52433,52434,52436,52439],{"class":114,"line":291},[112,52435,621],{"class":229},[112,52437,52438],{"class":236}," updated; ",[112,52440,52256],{"class":578},[112,52442,52443],{"class":114,"line":299},[112,52444,584],{"class":236},[16,52446],{},[67,52448,52450],{"id":52449},"step-7-deactivating-a-user-recommended","Step 7: Deactivating a User (Recommended)",[102,52452,52454],{"className":220,"code":52453,"language":222,"meta":107,"style":107},"export async function deactivateUser(connectionId: string, userId: string) {\n  // Some providers (e.g., BambooHR) do not support delete; set status to INACTIVE instead\n  const updated = await sdk.hris.updateHrisEmployee({\n    connectionId,\n    id: userId,\n    hrisEmployee: { employmentStatus: \"INACTIVE\" },\n  });\n  return updated;\n}\n",[109,52455,52456,52485,52490,52506,52510,52514,52524,52528,52535],{"__ignoreMap":107},[112,52457,52458,52460,52462,52464,52467,52469,52471,52473,52475,52477,52479,52481,52483],{"class":114,"line":115},[112,52459,503],{"class":229},[112,52461,506],{"class":229},[112,52463,509],{"class":229},[112,52465,52466],{"class":118}," deactivateUser",[112,52468,456],{"class":236},[112,52470,518],{"class":517},[112,52472,171],{"class":229},[112,52474,523],{"class":129},[112,52476,1046],{"class":236},[112,52478,52375],{"class":517},[112,52480,171],{"class":229},[112,52482,523],{"class":129},[112,52484,526],{"class":236},[112,52486,52487],{"class":114,"line":126},[112,52488,52489],{"class":578},"  // Some providers (e.g., BambooHR) do not support delete; set status to INACTIVE instead\n",[112,52491,52492,52494,52496,52498,52500,52502,52504],{"class":114,"line":135},[112,52493,531],{"class":229},[112,52495,52402],{"class":129},[112,52497,354],{"class":229},[112,52499,539],{"class":229},[112,52501,15863],{"class":236},[112,52503,52411],{"class":118},[112,52505,363],{"class":236},[112,52507,52508],{"class":114,"line":147},[112,52509,552],{"class":236},[112,52511,52512],{"class":114,"line":202},[112,52513,52422],{"class":236},[112,52515,52516,52519,52522],{"class":114,"line":208},[112,52517,52518],{"class":236},"    hrisEmployee: { employmentStatus: ",[112,52520,52521],{"class":122},"\"INACTIVE\"",[112,52523,378],{"class":236},[112,52525,52526],{"class":114,"line":291},[112,52527,567],{"class":236},[112,52529,52530,52532],{"class":114,"line":299},[112,52531,621],{"class":229},[112,52533,52534],{"class":236}," updated;\n",[112,52536,52537],{"class":114,"line":307},[112,52538,584],{"class":236},[16,52540],{},[67,52542,52544],{"id":52543},"step-8-verifying-a-user-background-check-license-etc","Step 8: Verifying a User (Background Check, License, etc.)",[19,52546,52547],{},"Unified's new Verification API lets you trigger background checks, license verifications, and more, using providers like Certn, Checkr, and others.",[102,52549,52551],{"className":220,"code":52550,"language":222,"meta":107,"style":107},"export async function listVerificationRequests(connectionId: string) {\n  // Listing requests is supported across providers; creation may vary by provider/package\n  const requests = await sdk.verification.listVerificationRequests({\n    connectionId,\n    limit: 10,\n  });\n  return requests;\n}\n",[109,52552,52553,52574,52579,52598,52602,52610,52614,52621],{"__ignoreMap":107},[112,52554,52555,52557,52559,52561,52564,52566,52568,52570,52572],{"class":114,"line":115},[112,52556,503],{"class":229},[112,52558,506],{"class":229},[112,52560,509],{"class":229},[112,52562,52563],{"class":118}," listVerificationRequests",[112,52565,456],{"class":236},[112,52567,518],{"class":517},[112,52569,171],{"class":229},[112,52571,523],{"class":129},[112,52573,526],{"class":236},[112,52575,52576],{"class":114,"line":126},[112,52577,52578],{"class":578},"  // Listing requests is supported across providers; creation may vary by provider/package\n",[112,52580,52581,52583,52586,52588,52590,52593,52596],{"class":114,"line":135},[112,52582,531],{"class":229},[112,52584,52585],{"class":129}," requests",[112,52587,354],{"class":229},[112,52589,539],{"class":229},[112,52591,52592],{"class":236}," sdk.verification.",[112,52594,52595],{"class":118},"listVerificationRequests",[112,52597,363],{"class":236},[112,52599,52600],{"class":114,"line":147},[112,52601,552],{"class":236},[112,52603,52604,52606,52608],{"class":114,"line":202},[112,52605,557],{"class":236},[112,52607,560],{"class":129},[112,52609,288],{"class":236},[112,52611,52612],{"class":114,"line":208},[112,52613,567],{"class":236},[112,52615,52616,52618],{"class":114,"line":291},[112,52617,621],{"class":229},[112,52619,52620],{"class":236}," requests;\n",[112,52622,52623],{"class":114,"line":299},[112,52624,584],{"class":236},[16,52626],{},[67,52628,21215],{"id":21214},[102,52630,52632],{"className":220,"code":52631,"language":222,"meta":107,"style":107},"async function main() {\n  // 1. Create a user\n  const user = await createUser(CONNECTION_BAMBOOHR!, \"jane.doe@example.com\", \"Jane\", \"Doe\");\n\n  // 2. List users\n  const users = await listUsers(CONNECTION_BAMBOOHR!);\n\n  // 3. Update (deactivate) user\n  if (user?.id) {\n    const updated = await updateUserStatus(CONNECTION_BAMBOOHR!, user.id, \"INACTIVE\");\n    console.log(\"Updated user:\", updated);\n  }\n\n  // 4. List verification requests (optional)\n  if (CONNECTION_VERIFICATION) {\n    const requests = await listVerificationRequests(CONNECTION_VERIFICATION!);\n    console.log(\"Verification requests:\", requests.length);\n  }\n\n  console.log(\"Users:\", users.length);\n}\n\nmain();\n",[109,52633,52634,52644,52649,52685,52689,52694,52715,52719,52724,52731,52756,52770,52774,52778,52783,52793,52813,52831,52835,52839,52857,52861,52865],{"__ignoreMap":107},[112,52635,52636,52638,52640,52642],{"class":114,"line":115},[112,52637,1377],{"class":229},[112,52639,509],{"class":229},[112,52641,1382],{"class":118},[112,52643,1385],{"class":236},[112,52645,52646],{"class":114,"line":126},[112,52647,52648],{"class":578},"  // 1. Create a user\n",[112,52650,52651,52653,52656,52658,52660,52662,52664,52666,52668,52670,52673,52675,52678,52680,52683],{"class":114,"line":135},[112,52652,531],{"class":229},[112,52654,52655],{"class":129}," user",[112,52657,354],{"class":229},[112,52659,539],{"class":229},[112,52661,52132],{"class":118},[112,52663,456],{"class":236},[112,52665,52057],{"class":129},[112,52667,375],{"class":229},[112,52669,1046],{"class":236},[112,52671,52672],{"class":122},"\"jane.doe@example.com\"",[112,52674,1046],{"class":236},[112,52676,52677],{"class":122},"\"Jane\"",[112,52679,1046],{"class":236},[112,52681,52682],{"class":122},"\"Doe\"",[112,52684,464],{"class":236},[112,52686,52687],{"class":114,"line":147},[112,52688,272],{"emptyLinePlaceholder":271},[112,52690,52691],{"class":114,"line":202},[112,52692,52693],{"class":578},"  // 2. List users\n",[112,52695,52696,52698,52701,52703,52705,52707,52709,52711,52713],{"class":114,"line":208},[112,52697,531],{"class":229},[112,52699,52700],{"class":129}," users",[112,52702,354],{"class":229},[112,52704,539],{"class":229},[112,52706,52282],{"class":118},[112,52708,456],{"class":236},[112,52710,52057],{"class":129},[112,52712,375],{"class":229},[112,52714,464],{"class":236},[112,52716,52717],{"class":114,"line":291},[112,52718,272],{"emptyLinePlaceholder":271},[112,52720,52721],{"class":114,"line":299},[112,52722,52723],{"class":578},"  // 3. Update (deactivate) user\n",[112,52725,52726,52728],{"class":114,"line":307},[112,52727,13931],{"class":229},[112,52729,52730],{"class":236}," (user?.id) {\n",[112,52732,52733,52735,52737,52739,52741,52743,52745,52747,52749,52752,52754],{"class":114,"line":315},[112,52734,1435],{"class":229},[112,52736,52402],{"class":129},[112,52738,354],{"class":229},[112,52740,539],{"class":229},[112,52742,52362],{"class":118},[112,52744,456],{"class":236},[112,52746,52057],{"class":129},[112,52748,375],{"class":229},[112,52750,52751],{"class":236},", user.id, ",[112,52753,52521],{"class":122},[112,52755,464],{"class":236},[112,52757,52758,52760,52762,52764,52767],{"class":114,"line":323},[112,52759,17339],{"class":236},[112,52761,1512],{"class":118},[112,52763,456],{"class":236},[112,52765,52766],{"class":122},"\"Updated user:\"",[112,52768,52769],{"class":236},", updated);\n",[112,52771,52772],{"class":114,"line":329},[112,52773,1476],{"class":236},[112,52775,52776],{"class":114,"line":341},[112,52777,272],{"emptyLinePlaceholder":271},[112,52779,52780],{"class":114,"line":346},[112,52781,52782],{"class":578},"  // 4. List verification requests (optional)\n",[112,52784,52785,52787,52789,52791],{"class":114,"line":366},[112,52786,13931],{"class":229},[112,52788,1419],{"class":236},[112,52790,52062],{"class":129},[112,52792,526],{"class":236},[112,52794,52795,52797,52799,52801,52803,52805,52807,52809,52811],{"class":114,"line":381},[112,52796,1435],{"class":229},[112,52798,52585],{"class":129},[112,52800,354],{"class":229},[112,52802,539],{"class":229},[112,52804,52563],{"class":118},[112,52806,456],{"class":236},[112,52808,52062],{"class":129},[112,52810,375],{"class":229},[112,52812,464],{"class":236},[112,52814,52815,52817,52819,52821,52824,52827,52829],{"class":114,"line":387},[112,52816,17339],{"class":236},[112,52818,1512],{"class":118},[112,52820,456],{"class":236},[112,52822,52823],{"class":122},"\"Verification requests:\"",[112,52825,52826],{"class":236},", requests.",[112,52828,14591],{"class":129},[112,52830,464],{"class":236},[112,52832,52833],{"class":114,"line":392},[112,52834,1476],{"class":236},[112,52836,52837],{"class":114,"line":409},[112,52838,272],{"emptyLinePlaceholder":271},[112,52840,52841,52843,52845,52847,52850,52853,52855],{"class":114,"line":422},[112,52842,1509],{"class":236},[112,52844,1512],{"class":118},[112,52846,456],{"class":236},[112,52848,52849],{"class":122},"\"Users:\"",[112,52851,52852],{"class":236},", users.",[112,52854,14591],{"class":129},[112,52856,464],{"class":236},[112,52858,52859],{"class":114,"line":435},[112,52860,584],{"class":236},[112,52862,52863],{"class":114,"line":440},[112,52864,272],{"emptyLinePlaceholder":271},[112,52866,52867,52869],{"class":114,"line":4949},[112,52868,1533],{"class":118},[112,52870,1536],{"class":236},[16,52872],{},[19,52874,52875],{},"And that's it - **Happy Building ** 🎉",[1558,52877,1560],{},{"title":107,"searchDepth":126,"depth":126,"links":52879},[52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890],{"id":69,"depth":126,"text":70},{"id":51931,"depth":126,"text":51932},{"id":96,"depth":126,"text":97},{"id":20611,"depth":126,"text":20612},{"id":469,"depth":126,"text":470},{"id":52115,"depth":126,"text":52116},{"id":52265,"depth":126,"text":52266},{"id":52345,"depth":126,"text":52346},{"id":52449,"depth":126,"text":52450},{"id":52543,"depth":126,"text":52544},{"id":21214,"depth":126,"text":21215},"With Unified's SCIM API devs can build use provisioning features that work with any HRIS integration like BambooHR, Workday and any other ATS integration that...",{"img":52893,"date":52894,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_user_provisioning_and_verification_with_unified-icon.png","2025-08-10T00:00:00.000Z","/guides/how_to_use_user_provisioning_and_verification_with_unified",{"title":51892,"description":52891},"guides/how_to_use_user_provisioning_and_verification_with_unified","8ILG4gIxbePTdN1EbZwg6w9MqIrqjFJctDLq24sfAhk",{"id":52900,"title":52901,"body":52902,"description":52918,"extension":1576,"meta":53102,"navigation":271,"path":53105,"seo":53106,"stem":53107,"__hash__":53108},"guides/guides/integration_set_up_guide_for_lever.md","Integration set-up guide for Lever",{"type":9,"value":52903,"toc":53094},[52904,52907,52909,52914,52919,52922,52925,52928,52934,52938,52944,52947,52953,52957,52960,52963,52969,52972,52976,52979,52987,52992,52997,53001,53008,53014,53017,53020,53034,53038,53041,53044,53047,53058,53070,53072],[12,52905,52901],{"id":52906},"integration-set-up-guide-for-lever",[16,52908],{},[19,52910,52911],{},[22,52912,52913],{},"September 27, 2023",[19,52915,52916],{},[478,52917,52918],{},"Easily add a Lever integration to your HR product. Access user data within Lever and other ATS systems through one API.",[19,52920,52921],{},"This article will take you through the steps to set up a Lever integration via Unified.to and connect your first Lever account.",[67,52923,52924],{"id":1745},"Getting Started",[19,52926,52927],{},"If you haven't already signed up for a Unified.to account, do so now (it's free). You can log in through your preferred identity provider such as Google, Microsoft, or GitHub.",[19,52929,52930],{},[1614,52931,52933],{"href":12214,"rel":52932},[1618],"Create an account",[67,52935,52937],{"id":52936},"_1-activate-lever","1. Activate Lever",[19,52939,52940,52941,52943],{},"Once you've registered your Unified.to account, log in and go to ",[478,52942,40572],{}," to select Lever and any other pre-built integrations you'd like to activate.",[19,52945,52946],{},"You can use the search bar, filter by app categories like \"HR\" and \"ATS\" or view all of our available integrations at once. The integrations you activate are the ones you intend to enable for user authorization.",[19,52948,52949],{},[1603,52950],{"alt":52951,"src":52952},"Activate-Lever.png","https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-0.png",[67,52954,52956],{"id":52955},"_2-use-your-oauth-2-credentials-optional","2. Use your OAuth 2 Credentials (Optional)",[19,52958,52959],{},"While most of our integrations can be activated in seconds, some integrations require OAuth 2 credentials.",[19,52961,52962],{},"To display your product's name and branding during the third-party authorization process, you will need to insert your OAuth 2 credentials. Follow the setup instructions linked below the integration ('Get your own OAuth 2 credentials →') to create and retrieve your credentials.",[19,52964,52965],{},[1603,52966],{"alt":52967,"src":52968},"Lever-Integration-Sandbox.png","https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-1.png",[19,52970,52971],{},"Insert your credentials (usually a Client ID and Secret) to activate the integration. If you'd like to test this integration with your Lever Sandbox account, select 'Sandbox' and provide your Lever Sandbox credentials.",[67,52973,52975],{"id":52974},"_3-copy-your-workspace-id","3. Copy your Workspace ID",[19,52977,52978],{},"Your workspace represents your organization. You can have multiple workspaces, for instance, if you require team members to work in different workspaces. You will need your workspace ID to add Lever and any other integrations to your app.",[19,52980,11822,52981,52983,52984,52986],{},[478,52982,49137],{}," found under ",[478,52985,25570],{}," to copy your workspace ID",[19,52988,52989],{},[1603,52990],{"alt":11593,"src":52991},"https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-2.png",[19,52993,52994],{},[22,52995,52996],{},"Note: you can create multiple environments in each workspace with distinct access and configuration rules for testing, staging, production, and more.",[67,52998,53000],{"id":52999},"_4-add-your-lever-integration-to-your-app","4. Add your Lever integration to your app",[19,53002,53003,53004,53007],{},"Once you've activated Lever and any other integrations, you'll be able to add them to your app. Go to ",[478,53005,53006],{},"Settings > Embedded Directory"," to copy one line of code to insert the embedded directory widget into your product. You can try out the user experience by interacting with the directory preview.",[19,53009,53010],{},[1603,53011],{"alt":53012,"src":53013},"Directory-Preview.png","https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-3.png",[19,53015,53016],{},"Alternatively, you can use our VueJS, React, or Angular components. Place the code into your app along with your workspace ID.",[19,53018,53019],{},"If you want an alternative to using our UI component, you can do either of the following:",[72,53021,53022,53031],{},[46,53023,53024,53025,53030],{},"Call our API to get a",[1614,53026,53029],{"href":53027,"rel":53028},"https://unified.to/apidocs#get/unified/integration/workspace/%7Bworkspace_id%7D",[1618]," list of active integrations"," to display in your app",[46,53032,53033],{},"If you have your user's API",[67,53035,53037],{"id":53036},"_5-perform-actions-with-your-user-connections","5. Perform Actions with your User Connections",[19,53039,53040],{},"Now you can start adding code to your app to access your user data and perform actions with their connections. If you're using NodeJS, we also have an SDK library available.",[19,53042,53043],{},"Alternatively, you can use our Mock API to see our data model in action. In your Sandbox environment, add env=Sandbox query parameter to your API calls to get mock data.",[19,53045,53046],{},"User connections represent a specific authentication of an integration, which means you can now:",[72,53048,53049,53052,53055],{},[46,53050,53051],{},"Access your customers' third-party data in Lever",[46,53053,53054],{},"Leverage user connections to automate workflows and personalize interactions",[46,53056,53057],{},"Extend your app's functionality with new features and expanded capabilities",[19,53059,53060,53061,53065,53066,634],{},"Need support? Email us at ",[1614,53062,53064],{"href":53063},"mailto:hello@unifited.to","hello@unifited.to"," or chat with our team on ",[1614,53067,12317],{"href":53068,"rel":53069},"https://discord.gg/uAYnMPFk9t",[1618],[19,53071,16274],{},[72,53073,53074,53081,53087],{},[46,53075,53076],{},[1614,53077,53080],{"href":53078,"rel":53079},"https://unified.to/help/set_environments_for_your_unified_workspace",[1618],"Set up multiple environments",[46,53082,53083],{},[1614,53084,26021],{"href":53085,"rel":53086},"https://unified.to/apidocs#auth",[1618],[46,53088,53089],{},[1614,53090,53093],{"href":53091,"rel":53092},"https://unified.to/apidocs#embed",[1618],"Embedded Directory",{"title":107,"searchDepth":126,"depth":126,"links":53095},[53096,53097,53098,53099,53100,53101],{"id":1745,"depth":126,"text":52924},{"id":52936,"depth":126,"text":52937},{"id":52955,"depth":126,"text":52956},{"id":52974,"depth":126,"text":52975},{"id":52999,"depth":126,"text":53000},{"id":53036,"depth":126,"text":53037},{"img":53103,"date":53104,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-icon.png","2023-09-27T00:00:00.000Z","/guides/integration_set_up_guide_for_lever",{"title":52901,"description":52918},"guides/integration_set_up_guide_for_lever","6Ix5OeHHNDQgeu4X8NzVbEQyN9IgUztphh88rY7mAZ4",{"id":53110,"title":53111,"body":53112,"description":53210,"extension":1576,"meta":53211,"navigation":271,"path":53214,"seo":53215,"stem":53216,"__hash__":53217},"guides/guides/managing_custom_validation_rules_in_salesforce.md","Managing custom validation rules in Salesforce",{"type":9,"value":53113,"toc":53208},[53114,53117,53119,53124,53131,53138,53154,53157],[12,53115,53111],{"id":53116},"managing-custom-validation-rules-in-salesforce",[16,53118],{},[19,53120,53121],{},[22,53122,53123],{},"March 22, 2024",[19,53125,53126,53127,53130],{},"If you are getting ",[109,53128,53129],{},"FIELD_CUSTOM_VALIDATION_EXCEPTION"," when trying to write data to a Salesforce connection, this means there is a custom validation rule on this Salesforce account and the data that you are providing isn't valid",[19,53132,53133,53134,53137],{},"To get ",[1614,53135,1640],{"href":1638,"rel":53136},[1618]," to be able to write this object you will need to get your customer to modify the Salesforce rule on their account to be less strict or remove the rule all together.",[19,53139,53140,53141,53144,53145,53150,53151,53153],{},"For example, you are getting ",[109,53142,53143],{},"\"FIELD_CUSTOM_VALIDATION_EXCEPTION: The Shipping address is required.\""," when trying to ",[1614,53146,53149],{"href":53147,"rel":53148},"https://docs.unified.to/crm/company/Create_a_company",[1618],"create a Company",". This means there is a custom rule on the Salesforce ",[478,53152,2162],{}," object that requires a shipping address.",[19,53155,53156],{},"Follow these instructions to modify/remove a custom rule for Account object:",[43,53158,53159,53169,53180,53190,53200],{},[46,53160,53161,53162,53164,53166],{},"Go to your Salesforce account and navigate to ",[478,53163,40664],{},[17180,53165],{},[1603,53167],{"alt":11593,"src":53168},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-0.png",[46,53170,53171,53172,53175,53177],{},"On the left-hand side navigate to ",[478,53173,53174],{},"Objects and Fields > Object Manager",[17180,53176],{},[1603,53178],{"alt":11593,"src":53179},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-1.png",[46,53181,53182,53183,53185,53187],{},"Select the object you need to modify the rules for. In our case ",[478,53184,2162],{},[17180,53186],{},[1603,53188],{"alt":11593,"src":53189},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-2.png",[46,53191,9735,53192,53195,53197],{},[478,53193,53194],{},"Validation Rules",[17180,53196],{},[1603,53198],{"alt":11593,"src":53199},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-3.png",[46,53201,53202,53203,53205],{},"Edit or remove the custom validation rule",[17180,53204],{},[1603,53206],{"alt":11593,"src":53207},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-4.png",{"title":107,"searchDepth":126,"depth":126,"links":53209},[],"If you are getting `FIELDCUSTOMVALIDATION_EXCEPTION` when trying to write data to a Salesforce connection, this means there is a custom validation rule on this...",{"img":53212,"date":53213,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-icon.png","2024-03-22T00:00:00.000Z","/guides/managing_custom_validation_rules_in_salesforce",{"title":53111,"description":53210},"guides/managing_custom_validation_rules_in_salesforce","61fCRijq-pfCK_Ybia-aScm3Q3saa5zMupIb3_NGws8",{"id":53219,"title":53220,"body":53221,"description":54279,"extension":1576,"meta":54280,"navigation":271,"path":54283,"seo":54284,"stem":54285,"__hash__":54286},"guides/guides/netsuite_token_based_authentication_setup_for_unified.md","NetSuite Token-Based Authentication Setup for Unified",{"type":9,"value":53222,"toc":54258},[53223,53226,53228,53233,53243,53271,53279,53281,53285,53297,53299,53303,53307,53310,53337,53343,53347,53358,53371,53374,53376,53380,53385,53389,53392,53394,53405,53409,53422,53434,53436,53440,53443,53453,53455,53485,53492,53500,53503,53515,53517,53521,53528,53532,53535,53546,53549,53563,53565,53569,53572,53574,53578,53585,53590,53592,53596,53780,53782,53786,53805,53807,53811,53920,53922,53926,53993,53995,53997,54011,54013,54017,54024,54026,54049,54051,54055,54058,54069,54073,54076,54086,54089,54112,54120,54122,54134,54143,54145,54149,54152,54176,54178,54182,54188,54191,54223,54230,54240,54244,54247],[12,53224,53220],{"id":53225},"netsuite-token-based-authentication-setup-for-unified",[16,53227],{},[19,53229,53230],{},[22,53231,53232],{},"February 12, 2026",[19,53234,53235,53236,53239,53240,171],{},"Unified connects to NetSuite using ",[478,53237,53238],{},"Token-Based Authentication (TBA)"," (OAuth 1.0a style). You will provide ",[478,53241,53242],{},"5 values",[43,53244,53245,53250,53255,53260,53266],{},[46,53246,53247],{},[478,53248,53249],{},"Realm / Account ID",[46,53251,53252],{},[478,53253,53254],{},"Consumer Key",[46,53256,53257],{},[478,53258,53259],{},"Consumer Secret",[46,53261,53262,53265],{},[478,53263,53264],{},"Token ID"," (a.k.a. Token Key)",[46,53267,53268],{},[478,53269,53270],{},"Token Secret",[10506,53272,53273],{},[19,53274,53275,53276,634],{},"'Realm' in most client libraries/connectors refers to the ",[478,53277,53278],{},"NetSuite Account ID",[16,53280],{},[67,53282,53284],{"id":53283},"what-you-need-before-starting","What you need before starting",[72,53286,53287,53290],{},[46,53288,53289],{},"Admin access (recommended) OR a NetSuite admin to perform the enablement + token creation.",[46,53291,53292,53293,53296],{},"The user you create the token for must have the ",[478,53294,53295],{},"correct role assigned",", and the token must be generated against that role.",[16,53298],{},[12,53300,53302],{"id":53301},"_1-enable-the-required-netsuite-features","1) Enable the required NetSuite features",[67,53304,53306],{"id":53305},"_11-enable-token-based-authentication-tba","1.1 Enable Token-Based Authentication (TBA)",[19,53308,53309],{},"In NetSuite:",[72,53311,53312,53317,53322],{},[46,53313,33699,53314],{},[478,53315,53316],{},"Setup → Company → Enable Features",[46,53318,42509,53319,34973],{},[478,53320,53321],{},"SuiteCloud",[46,53323,53324,53325,53328,53329],{},"In ",[478,53326,53327],{},"Manage Authentication",", enable:\n",[72,53330,53331],{},[46,53332,53333,53334],{},"✅ ",[478,53335,53336],{},"Token-Based Authentication",[19,53338,53339,53340,53342],{},"(Depending on your NetSuite setup, you may also see toggles for OAuth; for Unified's TBA flow, the key requirement is ",[478,53341,53336],{},".)",[67,53344,53346],{"id":53345},"_12-enable-rest-web-services-if-youre-using-suitetalk-rest-endpoints","1.2 Enable REST Web Services (if you're using SuiteTalk REST endpoints)",[19,53348,53349,53350,53353,53354,53357],{},"Ensure ",[478,53351,53352],{},"REST Web Services"," is enabled in ",[478,53355,53356],{},"Enable Features"," (commonly under SuiteCloud)",[72,53359,53360,53366],{},[46,53361,53324,53362,53365],{},[478,53363,53364],{},"Setup → Company → Enable Features"," → SuiteCloud tab",[46,53367,53368,53369],{},"Enable ",[478,53370,53352],{},[19,53372,53373],{},"Without this, the account cannot use the REST API and you will get 401 errors even with correct credentials.",[16,53375],{},[12,53377,53379],{"id":53378},"_2-find-your-realm-account-id","2) Find your 'Realm' / Account ID",[19,53381,53382,53383,634],{},"Unified's 'Realm ID' is your ",[478,53384,53278],{},[35,53386,53388],{"id":53387},"option-a-fast-from-the-url","Option A (fast): from the URL",[19,53390,53391],{},"When logged into NetSuite, your account ID is visible in the URL. Oracle describes this approach.",[19,53393,10603],{},[72,53395,53396],{},[46,53397,53398,53401,53402],{},[109,53399,53400],{},"https://1234567.app.netsuite.com/..."," → Account ID = ",[109,53403,53404],{},"1234567",[35,53406,53408],{"id":53407},"option-b-from-company-information","Option B: from Company Information",[72,53410,53411,53416],{},[46,53412,53413],{},[478,53414,53415],{},"Setup → Company → Company Information",[46,53417,53418,53419],{},"Find ",[478,53420,53421],{},"Account ID",[10506,53423,53424],{},[19,53425,53426,53429,53430,53433],{},[478,53427,53428],{},"Sandbox note:"," your account ID may include a sandbox suffix like ",[109,53431,53432],{},"-SB1"," (format varies by account).",[16,53435],{},[12,53437,53439],{"id":53438},"_3-create-the-integration-record-consumer-key-secret","3) Create the Integration Record (Consumer Key / Secret)",[19,53441,53442],{},"This is where you generate:",[72,53444,53445,53449],{},[46,53446,53447],{},[478,53448,53254],{},[46,53450,53451],{},[478,53452,53259],{},[19,53454,37940],{},[43,53456,53457,53462,53468,53474,53478,53483],{},[46,53458,33699,53459],{},[478,53460,53461],{},"Setup → Integration → Manage Integrations → New",[46,53463,53464,53465],{},"Give it a name like ",[478,53466,53467],{},"'Unified Integration'",[46,53469,53470,53471],{},"Set ",[478,53472,53473],{},"State = Enabled",[46,53475,41752,53476,34973],{},[478,53477,26021],{},[46,53479,53480,53481],{},"✅ Check ",[478,53482,53336],{},[46,53484,31780],{},[19,53486,53487,53488,53491],{},"Oracle's help doc explicitly calls out checking ",[478,53489,53490],{},"Token-based Authentication"," on the Integration Record.",[19,53493,53494,53495,33518,53497,53499],{},"After saving, NetSuite will display the ",[478,53496,53254],{},[478,53498,53259],{},". Copy them somewhere safe (you may not be able to view the secret again).",[19,53501,53502],{},"✅ Provide these to Unified as:",[72,53504,53505,53510],{},[46,53506,53507],{},[109,53508,53509],{},"consumer_key",[46,53511,53512],{},[109,53513,53514],{},"consumer_secret",[16,53516],{},[12,53518,53520],{"id":53519},"_4-create-configure-the-role-used-for-the-token","4) Create / Configure the Role used for the token",[19,53522,53523,53524,53527],{},"This is the most important part for avoiding ",[109,53525,53526],{},"401 INVALID_LOGIN"," and permission issues.",[67,53529,53531],{"id":53530},"recommended-use-administrator-role","Recommended: Use Administrator Role",[19,53533,53534],{},"The simplest and most reliable method:",[72,53536,53537,53543],{},[46,53538,53539,53540],{},"Use ",[478,53541,53542],{},"Administrator role",[46,53544,53545],{},"Create the access token under Administrator",[19,53547,53548],{},"This ensures:",[72,53550,53551,53554,53557,53560],{},[46,53552,53553],{},"All record access works",[46,53555,53556],{},"All subsidiaries are accessible",[46,53558,53559],{},"No hidden permission failures",[46,53561,53562],{},"Faster setup",[16,53564],{},[67,53566,53568],{"id":53567},"optional-create-a-dedicated-unified-api-role","Optional: Create a Dedicated Unified API Role",[19,53570,53571],{},"If your security policy requires a restricted role, create a custom role and assign the following permissions.",[16,53573],{},[67,53575,53577],{"id":53576},"required-permissions-if-using-custom-role","Required Permissions (If Using Custom Role)",[19,53579,53580,53581,53584],{},"Below is the ",[478,53582,53583],{},"complete permission set"," required for full accounting integration support.",[10506,53586,53587],{},[19,53588,53589],{},"⚠ NOTE: This list may be adjusted depending on your Unified workflows.\n⚠ NOTE:  In some cases, user-level restrictions can override role-level permissions. Please ensure that the user account itself is explicitly granted the following permissions as well.",[16,53591],{},[67,53593,53595],{"id":53594},"transaction-permissions","Transaction Permissions",[1868,53597,53598,53608],{},[1871,53599,53600],{},[1874,53601,53602,53605],{},[1877,53603,53604],{},"Permission",[1877,53606,53607],{},"Level",[1890,53609,53610,53618,53625,53632,53639,53646,53653,53661,53668,53675,53682,53689,53696,53703,53710,53717,53724,53731,53738,53745,53752,53759,53766,53773],{},[1874,53611,53612,53615],{},[1895,53613,53614],{},"Access Payment Audit Log",[1895,53616,53617],{},"Full",[1874,53619,53620,53623],{},[1895,53621,53622],{},"Bill Purchase Orders",[1895,53624,53617],{},[1874,53626,53627,53630],{},[1895,53628,53629],{},"Bills",[1895,53631,53617],{},[1874,53633,53634,53637],{},[1895,53635,53636],{},"Cash Sale",[1895,53638,53617],{},[1874,53640,53641,53644],{},[1895,53642,53643],{},"Cash Sale Refund",[1895,53645,53617],{},[1874,53647,53648,53651],{},[1895,53649,53650],{},"Credit Memo",[1895,53652,53617],{},[1874,53654,53655,53658],{},[1895,53656,53657],{},"Cross Charge Journal",[1895,53659,53660],{},"View",[1874,53662,53663,53666],{},[1895,53664,53665],{},"Customer Deposit",[1895,53667,53617],{},[1874,53669,53670,53673],{},[1895,53671,53672],{},"Customer Payment",[1895,53674,53617],{},[1874,53676,53677,53680],{},[1895,53678,53679],{},"Customer Refund",[1895,53681,53617],{},[1874,53683,53684,53687],{},[1895,53685,53686],{},"Enter Vendor Credits",[1895,53688,53617],{},[1874,53690,53691,53694],{},[1895,53692,53693],{},"Find Transaction",[1895,53695,53617],{},[1874,53697,53698,53701],{},[1895,53699,53700],{},"Intercompany Adjustments",[1895,53702,53617],{},[1874,53704,53705,53708],{},[1895,53706,53707],{},"Invoice",[1895,53709,53617],{},[1874,53711,53712,53715],{},[1895,53713,53714],{},"Invoice Approval",[1895,53716,53617],{},[1874,53718,53719,53722],{},[1895,53720,53721],{},"Invoice Sales Orders",[1895,53723,53617],{},[1874,53725,53726,53729],{},[1895,53727,53728],{},"Item Receipt",[1895,53730,53617],{},[1874,53732,53733,53736],{},[1895,53734,53735],{},"Item Shipment",[1895,53737,53617],{},[1874,53739,53740,53743],{},[1895,53741,53742],{},"Journal Approval",[1895,53744,53617],{},[1874,53746,53747,53750],{},[1895,53748,53749],{},"Make Journal Entry",[1895,53751,53617],{},[1874,53753,53754,53757],{},[1895,53755,53756],{},"Opportunity",[1895,53758,53617],{},[1874,53760,53761,53764],{},[1895,53762,53763],{},"Paycheck Journal",[1895,53765,53617],{},[1874,53767,53768,53771],{},[1895,53769,53770],{},"Receive Order",[1895,53772,53617],{},[1874,53774,53775,53778],{},[1895,53776,53777],{},"System Journal",[1895,53779,53617],{},[16,53781],{},[67,53783,53785],{"id":53784},"reports-permissions","Reports Permissions",[1868,53787,53788,53796],{},[1871,53789,53790],{},[1874,53791,53792,53794],{},[1877,53793,53604],{},[1877,53795,53607],{},[1890,53797,53798],{},[1874,53799,53800,53803],{},[1895,53801,53802],{},"Transaction Detail",[1895,53804,53660],{},[16,53806],{},[67,53808,53810],{"id":53809},"lists-permissions","Lists Permissions",[1868,53812,53813,53821],{},[1871,53814,53815],{},[1874,53816,53817,53819],{},[1877,53818,53604],{},[1877,53820,53607],{},[1890,53822,53823,53830,53837,53844,53851,53857,53864,53871,53878,53885,53892,53899,53906,53913],{},[1874,53824,53825,53828],{},[1895,53826,53827],{},"Accounts",[1895,53829,53617],{},[1874,53831,53832,53835],{},[1895,53833,53834],{},"Address List in Search",[1895,53836,53617],{},[1874,53838,53839,53842],{},[1895,53840,53841],{},"Contact-Subsidiary Relationship",[1895,53843,53660],{},[1874,53845,53846,53849],{},[1895,53847,53848],{},"Contacts",[1895,53850,53617],{},[1874,53852,53853,53855],{},[1895,53854,22643],{},[1895,53856,53617],{},[1874,53858,53859,53862],{},[1895,53860,53861],{},"Employee Record",[1895,53863,53617],{},[1874,53865,53866,53869],{},[1895,53867,53868],{},"Employees",[1895,53870,53617],{},[1874,53872,53873,53876],{},[1895,53874,53875],{},"Inventory Cost Template",[1895,53877,53660],{},[1874,53879,53880,53883],{},[1895,53881,53882],{},"Locations",[1895,53884,53617],{},[1874,53886,53887,53890],{},[1895,53888,53889],{},"Partners",[1895,53891,53617],{},[1874,53893,53894,53897],{},[1895,53895,53896],{},"Perform Search",[1895,53898,53660],{},[1874,53900,53901,53904],{},[1895,53902,53903],{},"Subsidiaries",[1895,53905,53617],{},[1874,53907,53908,53911],{},[1895,53909,53910],{},"Vendors",[1895,53912,53617],{},[1874,53914,53915,53918],{},[1895,53916,53917],{},"Currency",[1895,53919,53617],{},[16,53921],{},[67,53923,53925],{"id":53924},"setup-permissions","Setup Permissions",[1868,53927,53928,53936],{},[1871,53929,53930],{},[1874,53931,53932,53934],{},[1877,53933,53604],{},[1877,53935,53607],{},[1890,53937,53938,53945,53952,53959,53966,53973,53979,53986],{},[1874,53939,53940,53943],{},[1895,53941,53942],{},"Access Token Management",[1895,53944,53617],{},[1874,53946,53947,53950],{},[1895,53948,53949],{},"Integration Application",[1895,53951,53617],{},[1874,53953,53954,53957],{},[1895,53955,53956],{},"Log in using Access Tokens",[1895,53958,53617],{},[1874,53960,53961,53964],{},[1895,53962,53963],{},"Log in using OAuth 2.0 Access Tokens",[1895,53965,53617],{},[1874,53967,53968,53971],{},[1895,53969,53970],{},"OAuth 2.0 Authorized Applications Management",[1895,53972,53617],{},[1874,53974,53975,53977],{},[1895,53976,53352],{},[1895,53978,53617],{},[1874,53980,53981,53984],{},[1895,53982,53983],{},"Two-Factor Authentication Base",[1895,53985,53617],{},[1874,53987,53988,53991],{},[1895,53989,53990],{},"User Access Tokens",[1895,53992,53617],{},[16,53994],{},[35,53996,43428],{"id":35472},[72,53998,53999,54005,54008],{},[46,54000,54001,54002,634],{},"The token inherits permissions from the ",[478,54003,54004],{},"role selected when creating the token",[46,54006,54007],{},"If you create the token under the wrong role, API calls will fail.",[46,54009,54010],{},"Subsidiary access is controlled by role restrictions — ensure the role has access to all relevant subsidiaries.",[16,54012],{},[12,54014,54016],{"id":54015},"_5-assign-the-role-to-the-user-who-will-own-the-token","5) Assign the Role to the User who will own the token",[19,54018,54019,54020,54023],{},"Tokens are created for a ",[478,54021,54022],{},"User + Role + Integration Record"," combination.",[19,54025,37940],{},[43,54027,54028,54033,54039,54044,54047],{},[46,54029,33699,54030],{},[478,54031,54032],{},"Lists → Employees → Employees",[46,54034,54035,54036,610],{},"Select the user (or create an 'API User' like ",[109,54037,54038],{},"unified-api@yourcompany.com",[46,54040,42509,54041,34973],{},[478,54042,54043],{},"Access",[46,54045,54046],{},"Ensure the Administrator role (recommended) OR Unified API Role (if custom) is assigned to this user",[46,54048,31780],{},[16,54050],{},[12,54052,54054],{"id":54053},"_6-create-the-access-token-token-id-token-secret","6) Create the Access Token (Token ID / Token Secret)",[19,54056,54057],{},"This generates:",[72,54059,54060,54065],{},[46,54061,54062,54064],{},[478,54063,53264],{}," (Token Key)",[46,54066,54067],{},[478,54068,53270],{},[35,54070,54072],{"id":54071},"where-to-create-it","Where to create it",[19,54074,54075],{},"Typically:",[72,54077,54078],{},[46,54079,54080,54083,54085],{},[478,54081,54082],{},"Setup → Users/Roles → Access Tokens → New",[17180,54084],{},"(or 'Manage Access Tokens' depending on your NetSuite UI)",[19,54087,54088],{},"You will select:",[72,54090,54091,54097,54103,54109],{},[46,54092,54093,54096],{},[478,54094,54095],{},"Application / Integration Record"," = the integration you created ('Unified Integration')",[46,54098,54099,54102],{},[478,54100,54101],{},"User"," = the user you assigned the role to",[46,54104,54105,54108],{},[478,54106,54107],{},"Role"," = Administrator (recommended) OR Unified API Role",[46,54110,54111],{},"Token name (optional but recommended)",[19,54113,54114,54115,33518,54117,54119],{},"Save → NetSuite displays ",[478,54116,53264],{},[478,54118,53270],{},". Copy them immediately.",[19,54121,53502],{},[72,54123,54124,54129],{},[46,54125,54126],{},[109,54127,54128],{},"token_id",[46,54130,54131],{},[109,54132,54133],{},"token_secret",[10506,54135,54136],{},[19,54137,54138,54139,54142],{},"Important: the ",[478,54140,54141],{},"role you select when creating the token"," is the role whose permissions will be enforced on all API calls made with that token.",[16,54144],{},[12,54146,54148],{"id":54147},"_7-what-to-provide-to-unified-the-5-inputs","7) What to provide to Unified (the 5 inputs)",[19,54150,54151],{},"When connecting NetSuite in Unified, enter:",[43,54153,54154,54160,54164,54168,54172],{},[46,54155,54156,54159],{},[109,54157,54158],{},"realm_id"," (NetSuite Account ID)",[46,54161,54162],{},[109,54163,53509],{},[46,54165,54166],{},[109,54167,53514],{},[46,54169,54170],{},[109,54171,54128],{},[46,54173,54174],{},[109,54175,54133],{},[16,54177],{},[12,54179,54181],{"id":54180},"_8-validation-troubleshooting-checklist","8) Validation & troubleshooting checklist",[67,54183,54185,54186],{"id":54184},"_81-if-you-get401-invalid_login","8.1 If you get ",[109,54187,53526],{},[19,54189,54190],{},"This almost always means one of:",[72,54192,54193,54199,54207,54214,54220],{},[46,54194,54195,54196],{},"Token created under the wrong ",[478,54197,54198],{},"role",[46,54200,54201,54202,54204,54205,610],{},"Token/user not permitted to use tokens (missing ",[478,54203,53990],{}," / ",[478,54206,53942],{},[46,54208,54209,54210,54213],{},"Wrong ",[478,54211,54212],{},"realm/account id"," (especially sandbox vs prod)",[46,54215,54209,54216,54219],{},[478,54217,54218],{},"consumer key/secret"," paired with the token",[46,54221,54222],{},"Integration record disabled",[19,54224,54225,54226,54229],{},"NetSuite's error message itself suggests checking the ",[478,54227,54228],{},"Login Audit Trail",", which is the best source of truth:",[72,54231,54232],{},[46,54233,54234,54237,54239],{},[478,54235,54236],{},"Setup → Users/Roles → User Management → View Login Audit Trail",[17180,54238],{},"Look for token-based login details.",[67,54241,54243],{"id":54242},"_82-sandbox-vs-production","8.2 Sandbox vs Production",[19,54245,54246],{},"Make sure:",[72,54248,54249,54252,54255],{},[46,54250,54251],{},"Sandbox token is used only for sandbox",[46,54253,54254],{},"Production token only for production",[46,54256,54257],{},"Realm/account ID matches the environment",{"title":107,"searchDepth":126,"depth":126,"links":54259},[54260,54261,54262,54266,54267,54268,54269,54270,54271,54272,54276,54278],{"id":53283,"depth":126,"text":53284},{"id":53305,"depth":126,"text":53306},{"id":53345,"depth":126,"text":53346,"children":54263},[54264,54265],{"id":53387,"depth":135,"text":53388},{"id":53407,"depth":135,"text":53408},{"id":53530,"depth":126,"text":53531},{"id":53567,"depth":126,"text":53568},{"id":53576,"depth":126,"text":53577},{"id":53594,"depth":126,"text":53595},{"id":53784,"depth":126,"text":53785},{"id":53809,"depth":126,"text":53810},{"id":53924,"depth":126,"text":53925,"children":54273},[54274,54275],{"id":35472,"depth":135,"text":43428},{"id":54071,"depth":135,"text":54072},{"id":54184,"depth":126,"text":54277},"8.1 If you get 401 INVALID_LOGIN",{"id":54242,"depth":126,"text":54243},"Unified connects to NetSuite using Token-Based Authentication (TBA) (OAuth 1.0a style). You will provide 5 values,",{"img":54281,"date":54282,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/netsuite_token_based_authentication_setup_for_unified-icon.svg","2026-02-12T19:38:00.000Z","/guides/netsuite_token_based_authentication_setup_for_unified",{"title":53220,"description":54279},"guides/netsuite_token_based_authentication_setup_for_unified","HhxyYUqXP85rXVWHKUhCFQ4XT_TlwbitMF2Aw6pz4_U",{"id":54288,"title":54289,"body":54290,"description":61649,"extension":1576,"meta":61650,"navigation":271,"path":61653,"seo":61654,"stem":61655,"__hash__":61656},"guides/guides/notice_of_deprecation_of_fields_and_objects_nov_2025.md","Notice of Deprecation of Fields and Objects (Nov 2025)",{"type":9,"value":54291,"toc":61556},[54292,54295,54297,54301,54305,54308,54311,54314,54317,54320,54326,54328,54332,54370,54372,54375,54384,54392,54397,54453,54458,54475,54480,54496,54501,54527,54531,54605,54607,54614,54620,54624,54662,54666,54682,54686,54703,54707,54736,54740,54828,54830,54833,54841,54849,54857,54861,54878,54882,54922,54926,54940,54944,54962,54966,55043,55045,55053,55058,55068,55072,55087,55091,55103,55107,55125,55129,55206,55208,55216,55220,55227,55231,55246,55250,55266,55270,55288,55292,55368,55370,55378,55382,55389,55393,55409,55413,55429,55433,55451,55455,55532,55534,55537,55546,55551,55555,55564,55568,55584,55588,55605,55609,55640,55644,55751,55753,55762,55766,55772,55776,55791,55795,55809,55813,55832,55836,55938,55940,55948,55952,55960,55964,55979,55983,56000,56004,56032,56036,56197,56199,56203,56212,56220,56230,56234,56242,56246,56261,56265,56282,56286,56315,56319,56425,56427,56434,56438,56444,56448,56463,56467,56475,56479,56499,56503,56651,56653,56656,56665,56669,56676,56680,56708,56712,56734,56738,56765,56769,56848,56850,56855,56859,56865,56869,56885,56889,56894,56898,56914,56916,56924,56928,56938,56942,56958,56962,56976,56980,57012,57016,57132,57134,57143,57147,57156,57160,57177,57181,57195,57199,57225,57229,57379,57381,57390,57394,57400,57404,57420,57424,57437,57441,57457,57461,57571,57573,57582,57586,57592,57596,57612,57616,57629,57633,57649,57653,57763,57765,57778,57782,57788,57792,57809,57813,57833,57837,57858,57862,57980,57982,57991,57995,58001,58005,58021,58025,58039,58043,58059,58063,58122,58124,58134,58139,58150,58154,58162,58166,58187,58191,58257,58259,58262,58271,58275,58284,58288,58303,58307,58324,58328,58351,58355,58442,58444,58452,58456,58464,58468,58484,58488,58505,58509,58534,58538,58671,58673,58676,58685,58689,58699,58703,58719,58723,58736,58740,58765,58769,58849,58851,58854,58863,58867,58877,58881,58897,58901,58915,58917,58920,58929,58933,58940,58945,58961,58965,58978,58982,59003,59007,59074,59076,59085,59089,59163,59167,59189,59193,59211,59215,59232,59236,59328,59334,59338,59354,59358,59389,59393,59448,59454,59458,59481,59486,59520,59524,59552,59558,59579,59584,59601,59605,59739,59741,59748,59754,59762,59766,59774,59779,59816,59821,59826,60016,60021,60247,60252,60424,60429,60805,60809,60869,60873,60995,61000,61026,61028,61031,61038,61045,61050,61070,61074,61151,61155,61250,61254,61267,61269,61273,61459,61464,61475,61477,61481,61488,61498,61505,61513,61520,61536,61542,61553],[12,54293,54289],{"id":54294},"notice-of-deprecation-of-fields-and-objects-nov-2025",[16,54296],{},[19,54298,54299],{},[22,54300,41349],{},[12,54302,54304],{"id":54303},"deprecated-fields-objects-list-options","Deprecated Fields, Objects & List Options",[19,54306,54307],{},"At Unified, we have always built our unified data-models with a lot of thoughtful attention to detail, so that they never have to be 'versioned' due to backward-compatibility issues.",[19,54309,54310],{},"In fact, when we launch a new data object or a brand new category, designing our unified data models always takes longer than actually 'coding' the integrations.  Our customers have noticed and have told us that we have the best designed unified data models in the business.",[19,54312,54313],{},"Over the 2.5 years, as we've made improvements to the unified data-models, we have kept older fields and objects around so that our customers do not have to change their applications.",[19,54315,54316],{},"Today, we are announcing some deprecations of fields, data-models and list options that have been improved with others and will shortly be removed in our system.",[19,54318,54319],{},"This document provides a comprehensive breakdown of all deprecation in the Unified API as of November 2025, organized by category with migration recommendations.",[19,54321,54322,54323],{},"Please make all necessary changes to your code by ",[109,54324,54325],{},"JANUARY 7, 2026",[16,54327],{},[67,54329,54331],{"id":54330},"table-of-contents","Table of Contents",[43,54333,54334,54337,54340,54343,54346,54349,54352,54355,54358,54361,54364,54367],{},[46,54335,54336],{},"MetadataMetadata Fields",[46,54338,54339],{},"Parent Fields",[46,54341,54342],{},"HRIS Employee Fields",[46,54344,54345],{},"MessagingMessage Fields",[46,54347,54348],{},"Accounting Fields",[46,54350,54351],{},"ATS (Applicant Tracking System) Fields",[46,54353,54354],{},"Ticketing Fields",[46,54356,54357],{},"Calendar Fields",[46,54359,54360],{},"Query Parameters & Filters",[46,54362,54363],{},"Webhook Fields",[46,54365,54366],{},"Deprecated Objects/Usage Patterns",[46,54368,54369],{},"Deprecated Types/Interfaces",[16,54371],{},[67,54373,54336],{"id":54374},"metadatametadata-fields",[35,54376,54378,54379,48940,54382],{"id":54377},"field-key-slug","Field: ",[109,54380,54381],{},"key",[109,54383,10832],{},[72,54385,54386],{},[46,54387,54388,54389,54391],{},"the reason was the ",[109,54390,54381],{}," was a confusing name and could denote something else that it wasn't",[19,54393,54394],{},[478,54395,54396],{},"Affected Models:",[72,54398,54399,54408,54417,54426,54435,54444],{},[46,54400,54401,54404,54405],{},[109,54402,54403],{},"IKmsPageMetadata"," (KMS) - ",[109,54406,54407],{},"src/models/UnifiedKms.ts",[46,54409,54410,54413,54414],{},[109,54411,54412],{},"ITaskMetadata"," (Task) - ",[109,54415,54416],{},"src/models/UnifiedTask.ts",[46,54418,54419,54422,54423],{},[109,54420,54421],{},"IHrisMetadata"," (HRIS) - ",[109,54424,54425],{},"src/models/UnifiedHris.ts",[46,54427,54428,54431,54432],{},[109,54429,54430],{},"IAtsMetadata"," (ATS) - ",[109,54433,54434],{},"src/models/UnifiedAts.ts",[46,54436,54437,54440,54441],{},[109,54438,54439],{},"ICommerceMetadata"," (Commerce) - ",[109,54442,54443],{},"src/models/UnifiedCommerce.ts",[46,54445,54446,54449,54450],{},[109,54447,54448],{},"ICrmMetadata"," (CRM) - ",[109,54451,54452],{},"src/models/UnifiedCrm.ts",[19,54454,54455],{},[478,54456,54457],{},"Deprecated Field:",[102,54459,54461],{"className":220,"code":54460,"language":222,"meta":107,"style":107},"key?: string; // @deprecated; use slug instead\n",[109,54462,54463],{"__ignoreMap":107},[112,54464,54465,54467,54469,54472],{"class":114,"line":115},[112,54466,54381],{"class":236},[112,54468,10309],{"class":229},[112,54470,54471],{"class":236}," string; ",[112,54473,54474],{"class":578},"// @deprecated; use slug instead\n",[19,54476,54477],{},[478,54478,54479],{},"Replacement:",[102,54481,54483],{"className":220,"code":54482,"language":222,"meta":107,"style":107},"slug?: string; // Actual textual value of the slug\n",[109,54484,54485],{"__ignoreMap":107},[112,54486,54487,54489,54491,54493],{"class":114,"line":115},[112,54488,10832],{"class":236},[112,54490,10309],{"class":229},[112,54492,54471],{"class":236},[112,54494,54495],{"class":578},"// Actual textual value of the slug\n",[19,54497,54498],{},[478,54499,54500],{},"Migration Recommendation:",[72,54502,54503,54515],{},[46,54504,54505,54508,54509,44619,54512],{},[478,54506,54507],{},"Read Operations:"," Replace all references to ",[109,54510,54511],{},"metadata.key",[109,54513,54514],{},"metadata.slug",[46,54516,54517,54520,54521,54523,54524,54526],{},[478,54518,54519],{},"Write Operations:"," Use ",[109,54522,10832],{}," instead of ",[109,54525,54381],{}," when creating or updating metadata objects",[19,54528,54529],{},[478,54530,10603],{},[102,54532,54534],{"className":220,"code":54533,"language":222,"meta":107,"style":107},"// Before\nmetadata: [{\n    key: 'custom_field',\n    value: 'some value'\n}]\n\n// After\nmetadata: [{\n    slug: 'custom_field',\n    value: 'some value'\n}]\n",[109,54535,54536,54541,54548,54558,54566,54571,54575,54580,54586,54595,54601],{"__ignoreMap":107},[112,54537,54538],{"class":114,"line":115},[112,54539,54540],{"class":578},"// Before\n",[112,54542,54543,54545],{"class":114,"line":126},[112,54544,4631],{"class":118},[112,54546,54547],{"class":236},": [{\n",[112,54549,54550,54553,54556],{"class":114,"line":135},[112,54551,54552],{"class":236},"    key: ",[112,54554,54555],{"class":122},"'custom_field'",[112,54557,288],{"class":236},[112,54559,54560,54563],{"class":114,"line":147},[112,54561,54562],{"class":236},"    value: ",[112,54564,54565],{"class":122},"'some value'\n",[112,54567,54568],{"class":114,"line":202},[112,54569,54570],{"class":236},"}]\n",[112,54572,54573],{"class":114,"line":208},[112,54574,272],{"emptyLinePlaceholder":271},[112,54576,54577],{"class":114,"line":291},[112,54578,54579],{"class":578},"// After\n",[112,54581,54582,54584],{"class":114,"line":299},[112,54583,4631],{"class":118},[112,54585,54547],{"class":236},[112,54587,54588,54591,54593],{"class":114,"line":307},[112,54589,54590],{"class":236},"    slug: ",[112,54592,54555],{"class":122},[112,54594,288],{"class":236},[112,54596,54597,54599],{"class":114,"line":315},[112,54598,54562],{"class":236},[112,54600,54565],{"class":122},[112,54602,54603],{"class":114,"line":323},[112,54604,54570],{"class":236},[16,54606],{},[35,54608,54378,54610,48940,54612],{"id":54609},"field-type-format",[109,54611,2472],{},[109,54613,10518],{},[72,54615,54616],{},[46,54617,54388,54618,54391],{},[109,54619,2472],{},[19,54621,54622],{},[478,54623,54396],{},[72,54625,54626,54632,54638,54644,54650,54656],{},[46,54627,54628,54404,54630],{},[109,54629,54403],{},[109,54631,54407],{},[46,54633,54634,54413,54636],{},[109,54635,54412],{},[109,54637,54416],{},[46,54639,54640,54422,54642],{},[109,54641,54421],{},[109,54643,54425],{},[46,54645,54646,54431,54648],{},[109,54647,54430],{},[109,54649,54434],{},[46,54651,54652,54440,54654],{},[109,54653,54439],{},[109,54655,54443],{},[46,54657,54658,54449,54660],{},[109,54659,54448],{},[109,54661,54452],{},[19,54663,54664],{},[478,54665,54457],{},[102,54667,54669],{"className":220,"code":54668,"language":222,"meta":107,"style":107},"type?: string; // @deprecated; use format instead\n",[109,54670,54671],{"__ignoreMap":107},[112,54672,54673,54675,54677,54679],{"class":114,"line":115},[112,54674,2472],{"class":236},[112,54676,10309],{"class":229},[112,54678,54471],{"class":236},[112,54680,54681],{"class":578},"// @deprecated; use format instead\n",[19,54683,54684],{},[478,54685,54479],{},[102,54687,54689],{"className":220,"code":54688,"language":222,"meta":107,"style":107},"format?: TMetadataFormat; // Enum: TEXT, NUMBER, DATE, BOOLEAN, FILE, TEXTAREA, SINGLE_SELECT, MULTIPLE_SELECT, MEASUREMENT, PRICE, YES_NO, CURRENCY, URL, etc.\n",[109,54690,54691],{"__ignoreMap":107},[112,54692,54693,54695,54697,54700],{"class":114,"line":115},[112,54694,10518],{"class":236},[112,54696,10309],{"class":229},[112,54698,54699],{"class":236}," TMetadataFormat; ",[112,54701,54702],{"class":578},"// Enum: TEXT, NUMBER, DATE, BOOLEAN, FILE, TEXTAREA, SINGLE_SELECT, MULTIPLE_SELECT, MEASUREMENT, PRICE, YES_NO, CURRENCY, URL, etc.\n",[19,54704,54705],{},[478,54706,54500],{},[72,54708,54709,54719,54728],{},[46,54710,54711,54508,54713,44619,54716],{},[478,54712,54507],{},[109,54714,54715],{},"metadata.type",[109,54717,54718],{},"metadata.format",[46,54720,54721,54520,54723,54725,54726,523],{},[478,54722,54519],{},[109,54724,10518],{}," with the appropriate enum value instead of ",[109,54727,2472],{},[46,54729,54730,38500,54733,54735],{},[478,54731,54732],{},"Type Safety:",[109,54734,10518],{}," field uses strongly-typed enums, providing better type safety and validation",[19,54737,54738],{},[478,54739,10603],{},[102,54741,54743],{"className":220,"code":54742,"language":222,"meta":107,"style":107},"// Before\nmetadata: [{\n    key: 'age',\n    type: 'number',\n    value: 25\n}]\n\n// After\nmetadata: [{\n    slug: 'age',\n    format: 'NUMBER', // Use enum value\n    value: 25\n}]\n",[109,54744,54745,54749,54755,54764,54773,54780,54784,54788,54792,54798,54806,54818,54824],{"__ignoreMap":107},[112,54746,54747],{"class":114,"line":115},[112,54748,54540],{"class":578},[112,54750,54751,54753],{"class":114,"line":126},[112,54752,4631],{"class":118},[112,54754,54547],{"class":236},[112,54756,54757,54759,54762],{"class":114,"line":135},[112,54758,54552],{"class":236},[112,54760,54761],{"class":122},"'age'",[112,54763,288],{"class":236},[112,54765,54766,54768,54771],{"class":114,"line":147},[112,54767,18413],{"class":236},[112,54769,54770],{"class":122},"'number'",[112,54772,288],{"class":236},[112,54774,54775,54777],{"class":114,"line":202},[112,54776,54562],{"class":236},[112,54778,54779],{"class":129},"25\n",[112,54781,54782],{"class":114,"line":208},[112,54783,54570],{"class":236},[112,54785,54786],{"class":114,"line":291},[112,54787,272],{"emptyLinePlaceholder":271},[112,54789,54790],{"class":114,"line":299},[112,54791,54579],{"class":578},[112,54793,54794,54796],{"class":114,"line":307},[112,54795,4631],{"class":118},[112,54797,54547],{"class":236},[112,54799,54800,54802,54804],{"class":114,"line":315},[112,54801,54590],{"class":236},[112,54803,54761],{"class":122},[112,54805,288],{"class":236},[112,54807,54808,54811,54813,54815],{"class":114,"line":323},[112,54809,54810],{"class":236},"    format: ",[112,54812,10535],{"class":122},[112,54814,1046],{"class":236},[112,54816,54817],{"class":578},"// Use enum value\n",[112,54819,54820,54822],{"class":114,"line":329},[112,54821,54562],{"class":236},[112,54823,54779],{"class":129},[112,54825,54826],{"class":114,"line":341},[112,54827,54570],{"class":236},[16,54829],{},[67,54831,54339],{"id":54832},"parent-fields",[35,54834,54378,54836,48940,54839],{"id":54835},"field-parent_space_id-parent_id",[109,54837,54838],{},"parent_space_id",[109,54840,38430],{},[35,54842,54378,54844,48940,54847],{"id":54843},"field-parent_page_id-parent_id",[109,54845,54846],{},"parent_page_id",[109,54848,38430],{},[72,54850,54851],{},[46,54852,54853,54854,54856],{},"the reason was that we standardized across all of our unified data models the field name of ",[109,54855,38430],{}," when it denoted a parent of the current object (and is the same object)",[19,54858,54859],{},[478,54860,54396],{},[72,54862,54863,54871],{},[46,54864,54865,54868,54869],{},[109,54866,54867],{},"IKmsSpace"," - ",[109,54870,54407],{},[46,54872,54873,54868,54876],{},[109,54874,54875],{},"IKmsPage",[109,54877,54407],{},[19,54879,54880],{},[478,54881,54457],{},[102,54883,54885],{"className":220,"code":54884,"language":222,"meta":107,"style":107},"// In KmsSpace\nparent_space_id?: string; // @deprecated; use parent_id instead\n\n// In KmsPage\nparent_page_id?: string; // @deprecated; use parent_id instead\n",[109,54886,54887,54892,54903,54907,54912],{"__ignoreMap":107},[112,54888,54889],{"class":114,"line":115},[112,54890,54891],{"class":578},"// In KmsSpace\n",[112,54893,54894,54896,54898,54900],{"class":114,"line":126},[112,54895,54838],{"class":236},[112,54897,10309],{"class":229},[112,54899,54471],{"class":236},[112,54901,54902],{"class":578},"// @deprecated; use parent_id instead\n",[112,54904,54905],{"class":114,"line":135},[112,54906,272],{"emptyLinePlaceholder":271},[112,54908,54909],{"class":114,"line":147},[112,54910,54911],{"class":578},"// In KmsPage\n",[112,54913,54914,54916,54918,54920],{"class":114,"line":202},[112,54915,54846],{"class":236},[112,54917,10309],{"class":229},[112,54919,54471],{"class":236},[112,54921,54902],{"class":578},[19,54923,54924],{},[478,54925,54479],{},[102,54927,54929],{"className":220,"code":54928,"language":222,"meta":107,"style":107},"parent_id?: string;\n",[109,54930,54931],{"__ignoreMap":107},[112,54932,54933,54935,54937],{"class":114,"line":115},[112,54934,38430],{"class":236},[112,54936,10309],{"class":229},[112,54938,54939],{"class":236}," string;\n",[19,54941,54942],{},[478,54943,54500],{},[72,54945,54946,54955],{},[46,54947,54948,54520,54950,54523,54952,54954],{},[478,54949,54507],{},[109,54951,38430],{},[109,54953,54838],{}," when reading space objects",[46,54956,54957,54520,54959,54961],{},[478,54958,54519],{},[109,54960,38430],{}," when creating or updating spaces",[19,54963,54964],{},[478,54965,10603],{},[102,54967,54969],{"className":220,"code":54968,"language":222,"meta":107,"style":107},"// Before\nconst space = {\n    name: 'Subspace',\n    parent_space_id: 'space_123'\n}\n\n// After\nconst space = {\n    name: 'Subspace',\n    parent_id: 'space_123'\n}\n",[109,54970,54971,54975,54985,54994,55002,55006,55010,55014,55024,55032,55039],{"__ignoreMap":107},[112,54972,54973],{"class":114,"line":115},[112,54974,54540],{"class":578},[112,54976,54977,54979,54981,54983],{"class":114,"line":126},[112,54978,277],{"class":229},[112,54980,17508],{"class":129},[112,54982,354],{"class":229},[112,54984,280],{"class":236},[112,54986,54987,54989,54992],{"class":114,"line":135},[112,54988,18067],{"class":236},[112,54990,54991],{"class":122},"'Subspace'",[112,54993,288],{"class":236},[112,54995,54996,54999],{"class":114,"line":147},[112,54997,54998],{"class":236},"    parent_space_id: ",[112,55000,55001],{"class":122},"'space_123'\n",[112,55003,55004],{"class":114,"line":202},[112,55005,584],{"class":236},[112,55007,55008],{"class":114,"line":208},[112,55009,272],{"emptyLinePlaceholder":271},[112,55011,55012],{"class":114,"line":291},[112,55013,54579],{"class":578},[112,55015,55016,55018,55020,55022],{"class":114,"line":299},[112,55017,277],{"class":229},[112,55019,17508],{"class":129},[112,55021,354],{"class":229},[112,55023,280],{"class":236},[112,55025,55026,55028,55030],{"class":114,"line":307},[112,55027,18067],{"class":236},[112,55029,54991],{"class":122},[112,55031,288],{"class":236},[112,55033,55034,55037],{"class":114,"line":315},[112,55035,55036],{"class":236},"    parent_id: ",[112,55038,55001],{"class":122},[112,55040,55041],{"class":114,"line":323},[112,55042,584],{"class":236},[16,55044],{},[35,55046,54378,55048,48940,55051],{"id":55047},"field-parent_channel_id-parent_id",[109,55049,55050],{},"parent_channel_id",[109,55052,38430],{},[19,55054,55055],{},[478,55056,55057],{},"Affected Model:",[72,55059,55060],{},[46,55061,55062,54868,55065],{},[109,55063,55064],{},"IMessagingChannel",[109,55066,55067],{},"src/models/UnifiedMessaging.ts",[19,55069,55070],{},[478,55071,54457],{},[102,55073,55075],{"className":220,"code":55074,"language":222,"meta":107,"style":107},"parent_channel_id?: string; // @deprecated; use parent_id instead\n",[109,55076,55077],{"__ignoreMap":107},[112,55078,55079,55081,55083,55085],{"class":114,"line":115},[112,55080,55050],{"class":236},[112,55082,10309],{"class":229},[112,55084,54471],{"class":236},[112,55086,54902],{"class":578},[19,55088,55089],{},[478,55090,54479],{},[102,55092,55093],{"className":220,"code":54928,"language":222,"meta":107,"style":107},[109,55094,55095],{"__ignoreMap":107},[112,55096,55097,55099,55101],{"class":114,"line":115},[112,55098,38430],{"class":236},[112,55100,10309],{"class":229},[112,55102,54939],{"class":236},[19,55104,55105],{},[478,55106,54500],{},[72,55108,55109,55118],{},[46,55110,55111,54520,55113,54523,55115,55117],{},[478,55112,54507],{},[109,55114,38430],{},[109,55116,55050],{}," when reading channel objects",[46,55119,55120,54520,55122,55124],{},[478,55121,54519],{},[109,55123,38430],{}," when creating or updating channels",[19,55126,55127],{},[478,55128,10603],{},[102,55130,55132],{"className":220,"code":55131,"language":222,"meta":107,"style":107},"// Before\nconst channel = {\n    name: 'Sub-channel',\n    parent_channel_id: 'channel_123'\n}\n\n// After\nconst channel = {\n    name: 'Sub-channel',\n    parent_id: 'channel_123'\n}\n",[109,55133,55134,55138,55149,55158,55166,55170,55174,55178,55188,55196,55202],{"__ignoreMap":107},[112,55135,55136],{"class":114,"line":115},[112,55137,54540],{"class":578},[112,55139,55140,55142,55145,55147],{"class":114,"line":126},[112,55141,277],{"class":229},[112,55143,55144],{"class":129}," channel",[112,55146,354],{"class":229},[112,55148,280],{"class":236},[112,55150,55151,55153,55156],{"class":114,"line":135},[112,55152,18067],{"class":236},[112,55154,55155],{"class":122},"'Sub-channel'",[112,55157,288],{"class":236},[112,55159,55160,55163],{"class":114,"line":147},[112,55161,55162],{"class":236},"    parent_channel_id: ",[112,55164,55165],{"class":122},"'channel_123'\n",[112,55167,55168],{"class":114,"line":202},[112,55169,584],{"class":236},[112,55171,55172],{"class":114,"line":208},[112,55173,272],{"emptyLinePlaceholder":271},[112,55175,55176],{"class":114,"line":291},[112,55177,54579],{"class":578},[112,55179,55180,55182,55184,55186],{"class":114,"line":299},[112,55181,277],{"class":229},[112,55183,55144],{"class":129},[112,55185,354],{"class":229},[112,55187,280],{"class":236},[112,55189,55190,55192,55194],{"class":114,"line":307},[112,55191,18067],{"class":236},[112,55193,55155],{"class":122},[112,55195,288],{"class":236},[112,55197,55198,55200],{"class":114,"line":315},[112,55199,55036],{"class":236},[112,55201,55165],{"class":122},[112,55203,55204],{"class":114,"line":323},[112,55205,584],{"class":236},[16,55207],{},[35,55209,54378,55211,48940,55214],{"id":55210},"field-parent_account_id-parent_id",[109,55212,55213],{},"parent_account_id",[109,55215,38430],{},[19,55217,55218],{},[478,55219,55057],{},[72,55221,55222],{},[46,55223,55224],{},[109,55225,55226],{},"IAccountingAccount",[19,55228,55229],{},[478,55230,54457],{},[102,55232,55234],{"className":220,"code":55233,"language":222,"meta":107,"style":107},"parent_account_id?: string; // @deprecated; use parent_id instead\n",[109,55235,55236],{"__ignoreMap":107},[112,55237,55238,55240,55242,55244],{"class":114,"line":115},[112,55239,55213],{"class":236},[112,55241,10309],{"class":229},[112,55243,54471],{"class":236},[112,55245,54902],{"class":578},[19,55247,55248],{},[478,55249,54479],{},[102,55251,55253],{"className":220,"code":55252,"language":222,"meta":107,"style":107},"parent_id?: string; // The parent account ID for this account\n",[109,55254,55255],{"__ignoreMap":107},[112,55256,55257,55259,55261,55263],{"class":114,"line":115},[112,55258,38430],{"class":236},[112,55260,10309],{"class":229},[112,55262,54471],{"class":236},[112,55264,55265],{"class":578},"// The parent account ID for this account\n",[19,55267,55268],{},[478,55269,54500],{},[72,55271,55272,55281],{},[46,55273,55274,54520,55276,54523,55278,55280],{},[478,55275,54507],{},[109,55277,38430],{},[109,55279,55213],{}," when reading account objects",[46,55282,55283,54520,55285,55287],{},[478,55284,54519],{},[109,55286,38430],{}," when creating or updating accounts",[19,55289,55290],{},[478,55291,10603],{},[102,55293,55295],{"className":220,"code":55294,"language":222,"meta":107,"style":107},"// Before\nconst account = {\n    name: 'Sub-account',\n    parent_account_id: 'account_123'\n}\n\n// After\nconst account = {\n    name: 'Sub-account',\n    parent_id: 'account_123'\n}\n",[109,55296,55297,55301,55311,55320,55328,55332,55336,55340,55350,55358,55364],{"__ignoreMap":107},[112,55298,55299],{"class":114,"line":115},[112,55300,54540],{"class":578},[112,55302,55303,55305,55307,55309],{"class":114,"line":126},[112,55304,277],{"class":229},[112,55306,17048],{"class":129},[112,55308,354],{"class":229},[112,55310,280],{"class":236},[112,55312,55313,55315,55318],{"class":114,"line":135},[112,55314,18067],{"class":236},[112,55316,55317],{"class":122},"'Sub-account'",[112,55319,288],{"class":236},[112,55321,55322,55325],{"class":114,"line":147},[112,55323,55324],{"class":236},"    parent_account_id: ",[112,55326,55327],{"class":122},"'account_123'\n",[112,55329,55330],{"class":114,"line":202},[112,55331,584],{"class":236},[112,55333,55334],{"class":114,"line":208},[112,55335,272],{"emptyLinePlaceholder":271},[112,55337,55338],{"class":114,"line":291},[112,55339,54579],{"class":578},[112,55341,55342,55344,55346,55348],{"class":114,"line":299},[112,55343,277],{"class":229},[112,55345,17048],{"class":129},[112,55347,354],{"class":229},[112,55349,280],{"class":236},[112,55351,55352,55354,55356],{"class":114,"line":307},[112,55353,18067],{"class":236},[112,55355,55317],{"class":122},[112,55357,288],{"class":236},[112,55359,55360,55362],{"class":114,"line":315},[112,55361,55036],{"class":236},[112,55363,55327],{"class":122},[112,55365,55366],{"class":114,"line":323},[112,55367,584],{"class":236},[16,55369],{},[35,55371,54378,55373,48940,55376],{"id":55372},"field-parent_message_id-parent_id",[109,55374,55375],{},"parent_message_id",[109,55377,38430],{},[19,55379,55380],{},[478,55381,55057],{},[72,55383,55384],{},[46,55385,55386],{},[109,55387,55388],{},"IMessagingMessage",[19,55390,55391],{},[478,55392,54457],{},[102,55394,55396],{"className":220,"code":55395,"language":222,"meta":107,"style":107},"parent_message_id?: string; // @deprecated; use parent_id\n",[109,55397,55398],{"__ignoreMap":107},[112,55399,55400,55402,55404,55406],{"class":114,"line":115},[112,55401,55375],{"class":236},[112,55403,10309],{"class":229},[112,55405,54471],{"class":236},[112,55407,55408],{"class":578},"// @deprecated; use parent_id\n",[19,55410,55411],{},[478,55412,54479],{},[102,55414,55416],{"className":220,"code":55415,"language":222,"meta":107,"style":107},"parent_id?: string; // Represents the ID of the immediate predecessor message in the thread\n",[109,55417,55418],{"__ignoreMap":107},[112,55419,55420,55422,55424,55426],{"class":114,"line":115},[112,55421,38430],{"class":236},[112,55423,10309],{"class":229},[112,55425,54471],{"class":236},[112,55427,55428],{"class":578},"// Represents the ID of the immediate predecessor message in the thread\n",[19,55430,55431],{},[478,55432,54500],{},[72,55434,55435,55444],{},[46,55436,55437,54520,55439,54523,55441,55443],{},[478,55438,54507],{},[109,55440,38430],{},[109,55442,55375],{}," when reading message objects",[46,55445,55446,54520,55448,55450],{},[478,55447,54519],{},[109,55449,38430],{}," when creating threaded messages",[19,55452,55453],{},[478,55454,10603],{},[102,55456,55458],{"className":220,"code":55457,"language":222,"meta":107,"style":107},"// Before\nconst message = {\n    message: 'Reply text',\n    parent_message_id: 'msg_123'\n}\n\n// After\nconst message = {\n    message: 'Reply text',\n    parent_id: 'msg_123'\n}\n",[109,55459,55460,55464,55474,55484,55492,55496,55500,55504,55514,55522,55528],{"__ignoreMap":107},[112,55461,55462],{"class":114,"line":115},[112,55463,54540],{"class":578},[112,55465,55466,55468,55470,55472],{"class":114,"line":126},[112,55467,277],{"class":229},[112,55469,18826],{"class":129},[112,55471,354],{"class":229},[112,55473,280],{"class":236},[112,55475,55476,55479,55482],{"class":114,"line":135},[112,55477,55478],{"class":236},"    message: ",[112,55480,55481],{"class":122},"'Reply text'",[112,55483,288],{"class":236},[112,55485,55486,55489],{"class":114,"line":147},[112,55487,55488],{"class":236},"    parent_message_id: ",[112,55490,55491],{"class":122},"'msg_123'\n",[112,55493,55494],{"class":114,"line":202},[112,55495,584],{"class":236},[112,55497,55498],{"class":114,"line":208},[112,55499,272],{"emptyLinePlaceholder":271},[112,55501,55502],{"class":114,"line":291},[112,55503,54579],{"class":578},[112,55505,55506,55508,55510,55512],{"class":114,"line":299},[112,55507,277],{"class":229},[112,55509,18826],{"class":129},[112,55511,354],{"class":229},[112,55513,280],{"class":236},[112,55515,55516,55518,55520],{"class":114,"line":307},[112,55517,55478],{"class":236},[112,55519,55481],{"class":122},[112,55521,288],{"class":236},[112,55523,55524,55526],{"class":114,"line":315},[112,55525,55036],{"class":236},[112,55527,55491],{"class":122},[112,55529,55530],{"class":114,"line":323},[112,55531,584],{"class":236},[16,55533],{},[67,55535,54342],{"id":55536},"hris-employee-fields",[35,55538,54378,55540,48940,55543],{"id":55539},"field-department-groups",[109,55541,55542],{},"department",[109,55544,55545],{},"groups",[72,55547,55548],{},[46,55549,55550],{},"we unified all HR 'grouping' objects into one called HRIS Group.  Groups have types that denote if they are a department, business unit, team, …",[19,55552,55553],{},[478,55554,55057],{},[72,55556,55557],{},[46,55558,55559,54868,55562],{},[109,55560,55561],{},"IHrisEmployee",[109,55563,54425],{},[19,55565,55566],{},[478,55567,54457],{},[102,55569,55571],{"className":220,"code":55570,"language":222,"meta":107,"style":107},"department?: string; // @deprecated\n",[109,55572,55573],{"__ignoreMap":107},[112,55574,55575,55577,55579,55581],{"class":114,"line":115},[112,55576,55542],{"class":236},[112,55578,10309],{"class":229},[112,55580,54471],{"class":236},[112,55582,55583],{"class":578},"// @deprecated\n",[19,55585,55586],{},[478,55587,54479],{},[102,55589,55591],{"className":220,"code":55590,"language":222,"meta":107,"style":107},"groups?: IHrisGroup[]; // Which groups/teams/units that this employee/user belongs to\n",[109,55592,55593],{"__ignoreMap":107},[112,55594,55595,55597,55599,55602],{"class":114,"line":115},[112,55596,55545],{"class":236},[112,55598,10309],{"class":229},[112,55600,55601],{"class":236}," IHrisGroup[]; ",[112,55603,55604],{"class":578},"// Which groups/teams/units that this employee/user belongs to\n",[19,55606,55607],{},[478,55608,54500],{},[72,55610,55611,55619,55632],{},[46,55612,55613,55615,55616,55618],{},[478,55614,54507],{}," Access department information through the ",[109,55617,55545],{}," array",[46,55620,55621,54520,55623,55625,55626,55629,55630,523],{},[478,55622,54519],{},[109,55624,55545],{}," array with ",[109,55627,55628],{},"IHrisGroup"," objects instead of a single ",[109,55631,55542],{},[46,55633,55634,38500,55637,55639],{},[478,55635,55636],{},"Multiple Groups:",[109,55638,55545],{}," field supports multiple group memberships, which is more flexible than a single department",[19,55641,55642],{},[478,55643,10603],{},[102,55645,55647],{"className":220,"code":55646,"language":222,"meta":107,"style":107},"// Before\nconst employee = {\n    name: 'John Doe',\n    department: 'Engineering'\n}\n\n// After\nconst employee = {\n    name: 'John Doe',\n    groups: [{\n        id: 'group_123',\n        name: 'Engineering',\n        type: 'DEPARTMENT'\n    }]\n}\n",[109,55648,55649,55653,55663,55671,55679,55683,55687,55691,55701,55709,55714,55724,55734,55742,55747],{"__ignoreMap":107},[112,55650,55651],{"class":114,"line":115},[112,55652,54540],{"class":578},[112,55654,55655,55657,55659,55661],{"class":114,"line":126},[112,55656,277],{"class":229},[112,55658,52175],{"class":129},[112,55660,354],{"class":229},[112,55662,280],{"class":236},[112,55664,55665,55667,55669],{"class":114,"line":135},[112,55666,18067],{"class":236},[112,55668,48123],{"class":122},[112,55670,288],{"class":236},[112,55672,55673,55676],{"class":114,"line":147},[112,55674,55675],{"class":236},"    department: ",[112,55677,55678],{"class":122},"'Engineering'\n",[112,55680,55681],{"class":114,"line":202},[112,55682,584],{"class":236},[112,55684,55685],{"class":114,"line":208},[112,55686,272],{"emptyLinePlaceholder":271},[112,55688,55689],{"class":114,"line":291},[112,55690,54579],{"class":578},[112,55692,55693,55695,55697,55699],{"class":114,"line":299},[112,55694,277],{"class":229},[112,55696,52175],{"class":129},[112,55698,354],{"class":229},[112,55700,280],{"class":236},[112,55702,55703,55705,55707],{"class":114,"line":307},[112,55704,18067],{"class":236},[112,55706,48123],{"class":122},[112,55708,288],{"class":236},[112,55710,55711],{"class":114,"line":315},[112,55712,55713],{"class":236},"    groups: [{\n",[112,55715,55716,55719,55722],{"class":114,"line":323},[112,55717,55718],{"class":236},"        id: ",[112,55720,55721],{"class":122},"'group_123'",[112,55723,288],{"class":236},[112,55725,55726,55729,55732],{"class":114,"line":329},[112,55727,55728],{"class":236},"        name: ",[112,55730,55731],{"class":122},"'Engineering'",[112,55733,288],{"class":236},[112,55735,55736,55739],{"class":114,"line":341},[112,55737,55738],{"class":236},"        type: ",[112,55740,55741],{"class":122},"'DEPARTMENT'\n",[112,55743,55744],{"class":114,"line":346},[112,55745,55746],{"class":236},"    }]\n",[112,55748,55749],{"class":114,"line":366},[112,55750,584],{"class":236},[16,55752],{},[35,55754,55756,55757,48940,55760],{"id":55755},"fielddivision-groups","Field:",[109,55758,55759],{},"division",[109,55761,55545],{},[19,55763,55764],{},[478,55765,55057],{},[72,55767,55768],{},[46,55769,55770],{},[109,55771,55561],{},[19,55773,55774],{},[478,55775,54457],{},[102,55777,55779],{"className":220,"code":55778,"language":222,"meta":107,"style":107},"division?: string; // @deprecated\n",[109,55780,55781],{"__ignoreMap":107},[112,55782,55783,55785,55787,55789],{"class":114,"line":115},[112,55784,55759],{"class":236},[112,55786,10309],{"class":229},[112,55788,54471],{"class":236},[112,55790,55583],{"class":578},[19,55792,55793],{},[478,55794,54479],{},[102,55796,55797],{"className":220,"code":55590,"language":222,"meta":107,"style":107},[109,55798,55799],{"__ignoreMap":107},[112,55800,55801,55803,55805,55807],{"class":114,"line":115},[112,55802,55545],{"class":236},[112,55804,10309],{"class":229},[112,55806,55601],{"class":236},[112,55808,55604],{"class":578},[19,55810,55811],{},[478,55812,54500],{},[72,55814,55815,55822],{},[46,55816,55817,55819,55820,55618],{},[478,55818,54507],{}," Access division information through the ",[109,55821,55545],{},[46,55823,55824,54520,55826,55625,55828,55629,55830,523],{},[478,55825,54519],{},[109,55827,55545],{},[109,55829,55628],{},[109,55831,55759],{},[19,55833,55834],{},[478,55835,10603],{},[102,55837,55839],{"className":220,"code":55838,"language":222,"meta":107,"style":107},"// Before\nconst employee = {\n    name: 'John Doe',\n    division: 'Product'\n}\n\n// After\nconst employee = {\n    name: 'John Doe',\n    groups: [{\n        id: 'group_456',\n        name: 'Product',\n        type: 'DIVISION'\n    }]\n}\n",[109,55840,55841,55845,55855,55863,55871,55875,55879,55883,55893,55901,55905,55914,55923,55930,55934],{"__ignoreMap":107},[112,55842,55843],{"class":114,"line":115},[112,55844,54540],{"class":578},[112,55846,55847,55849,55851,55853],{"class":114,"line":126},[112,55848,277],{"class":229},[112,55850,52175],{"class":129},[112,55852,354],{"class":229},[112,55854,280],{"class":236},[112,55856,55857,55859,55861],{"class":114,"line":135},[112,55858,18067],{"class":236},[112,55860,48123],{"class":122},[112,55862,288],{"class":236},[112,55864,55865,55868],{"class":114,"line":147},[112,55866,55867],{"class":236},"    division: ",[112,55869,55870],{"class":122},"'Product'\n",[112,55872,55873],{"class":114,"line":202},[112,55874,584],{"class":236},[112,55876,55877],{"class":114,"line":208},[112,55878,272],{"emptyLinePlaceholder":271},[112,55880,55881],{"class":114,"line":291},[112,55882,54579],{"class":578},[112,55884,55885,55887,55889,55891],{"class":114,"line":299},[112,55886,277],{"class":229},[112,55888,52175],{"class":129},[112,55890,354],{"class":229},[112,55892,280],{"class":236},[112,55894,55895,55897,55899],{"class":114,"line":307},[112,55896,18067],{"class":236},[112,55898,48123],{"class":122},[112,55900,288],{"class":236},[112,55902,55903],{"class":114,"line":315},[112,55904,55713],{"class":236},[112,55906,55907,55909,55912],{"class":114,"line":323},[112,55908,55718],{"class":236},[112,55910,55911],{"class":122},"'group_456'",[112,55913,288],{"class":236},[112,55915,55916,55918,55921],{"class":114,"line":329},[112,55917,55728],{"class":236},[112,55919,55920],{"class":122},"'Product'",[112,55922,288],{"class":236},[112,55924,55925,55927],{"class":114,"line":341},[112,55926,55738],{"class":236},[112,55928,55929],{"class":122},"'DIVISION'\n",[112,55931,55932],{"class":114,"line":346},[112,55933,55746],{"class":236},[112,55935,55936],{"class":114,"line":366},[112,55937,584],{"class":236},[16,55939],{},[35,55941,54378,55943,48940,55945],{"id":55942},"field-location-locations",[109,55944,16573],{},[109,55946,55947],{},"locations",[19,55949,55950],{},[478,55951,55057],{},[72,55953,55954],{},[46,55955,55956,54868,55958],{},[109,55957,55561],{},[109,55959,54425],{},[19,55961,55962],{},[478,55963,54457],{},[102,55965,55967],{"className":220,"code":55966,"language":222,"meta":107,"style":107},"location?: string; // @deprecated\n",[109,55968,55969],{"__ignoreMap":107},[112,55970,55971,55973,55975,55977],{"class":114,"line":115},[112,55972,16573],{"class":236},[112,55974,10309],{"class":229},[112,55976,54471],{"class":236},[112,55978,55583],{"class":578},[19,55980,55981],{},[478,55982,54479],{},[102,55984,55986],{"className":220,"code":55985,"language":222,"meta":107,"style":107},"locations?: IHrisLocation[]; // Array of partial location objects\n",[109,55987,55988],{"__ignoreMap":107},[112,55989,55990,55992,55994,55997],{"class":114,"line":115},[112,55991,55947],{"class":236},[112,55993,10309],{"class":229},[112,55995,55996],{"class":236}," IHrisLocation[]; ",[112,55998,55999],{"class":578},"// Array of partial location objects\n",[19,56001,56002],{},[478,56003,54500],{},[72,56005,56006,56013,56024],{},[46,56007,56008,56010,56011,55618],{},[478,56009,54507],{}," Access location information through the ",[109,56012,55947],{},[46,56014,56015,54520,56017,55625,56019,55629,56022,523],{},[478,56016,54519],{},[109,56018,55947],{},[109,56020,56021],{},"IHrisLocation",[109,56023,16573],{},[46,56025,56026,38500,56029,56031],{},[478,56027,56028],{},"Rich Data:",[109,56030,55947],{}," array provides full address details, timezone, currency, and other metadata",[19,56033,56034],{},[478,56035,10603],{},[102,56037,56039],{"className":220,"code":56038,"language":222,"meta":107,"style":107},"// Before\nconst employee = {\n    name: 'John Doe',\n    location: 'San Francisco Office'\n}\n\n// After\nconst employee = {\n    name: 'John Doe',\n    locations: [{\n        id: 'loc_123',\n        name: 'San Francisco Office',\n        address: {\n            address1: '123 Main St',\n            city: 'San Francisco',\n            region: 'CA',\n            postal_code: '94102',\n            country: 'United States'\n        },\n        timezone: 'America/Los_Angeles'\n    }]\n}\n",[109,56040,56041,56045,56055,56063,56071,56075,56079,56083,56093,56101,56106,56115,56124,56129,56139,56149,56159,56169,56177,56181,56189,56193],{"__ignoreMap":107},[112,56042,56043],{"class":114,"line":115},[112,56044,54540],{"class":578},[112,56046,56047,56049,56051,56053],{"class":114,"line":126},[112,56048,277],{"class":229},[112,56050,52175],{"class":129},[112,56052,354],{"class":229},[112,56054,280],{"class":236},[112,56056,56057,56059,56061],{"class":114,"line":135},[112,56058,18067],{"class":236},[112,56060,48123],{"class":122},[112,56062,288],{"class":236},[112,56064,56065,56068],{"class":114,"line":147},[112,56066,56067],{"class":236},"    location: ",[112,56069,56070],{"class":122},"'San Francisco Office'\n",[112,56072,56073],{"class":114,"line":202},[112,56074,584],{"class":236},[112,56076,56077],{"class":114,"line":208},[112,56078,272],{"emptyLinePlaceholder":271},[112,56080,56081],{"class":114,"line":291},[112,56082,54579],{"class":578},[112,56084,56085,56087,56089,56091],{"class":114,"line":299},[112,56086,277],{"class":229},[112,56088,52175],{"class":129},[112,56090,354],{"class":229},[112,56092,280],{"class":236},[112,56094,56095,56097,56099],{"class":114,"line":307},[112,56096,18067],{"class":236},[112,56098,48123],{"class":122},[112,56100,288],{"class":236},[112,56102,56103],{"class":114,"line":315},[112,56104,56105],{"class":236},"    locations: [{\n",[112,56107,56108,56110,56113],{"class":114,"line":323},[112,56109,55718],{"class":236},[112,56111,56112],{"class":122},"'loc_123'",[112,56114,288],{"class":236},[112,56116,56117,56119,56122],{"class":114,"line":329},[112,56118,55728],{"class":236},[112,56120,56121],{"class":122},"'San Francisco Office'",[112,56123,288],{"class":236},[112,56125,56126],{"class":114,"line":341},[112,56127,56128],{"class":236},"        address: {\n",[112,56130,56131,56134,56137],{"class":114,"line":346},[112,56132,56133],{"class":236},"            address1: ",[112,56135,56136],{"class":122},"'123 Main St'",[112,56138,288],{"class":236},[112,56140,56141,56144,56147],{"class":114,"line":366},[112,56142,56143],{"class":236},"            city: ",[112,56145,56146],{"class":122},"'San Francisco'",[112,56148,288],{"class":236},[112,56150,56151,56154,56157],{"class":114,"line":381},[112,56152,56153],{"class":236},"            region: ",[112,56155,56156],{"class":122},"'CA'",[112,56158,288],{"class":236},[112,56160,56161,56164,56167],{"class":114,"line":387},[112,56162,56163],{"class":236},"            postal_code: ",[112,56165,56166],{"class":122},"'94102'",[112,56168,288],{"class":236},[112,56170,56171,56174],{"class":114,"line":392},[112,56172,56173],{"class":236},"            country: ",[112,56175,56176],{"class":122},"'United States'\n",[112,56178,56179],{"class":114,"line":409},[112,56180,4803],{"class":236},[112,56182,56183,56186],{"class":114,"line":422},[112,56184,56185],{"class":236},"        timezone: ",[112,56187,56188],{"class":122},"'America/Los_Angeles'\n",[112,56190,56191],{"class":114,"line":435},[112,56192,55746],{"class":236},[112,56194,56195],{"class":114,"line":440},[112,56196,584],{"class":236},[16,56198],{},[67,56200,56202],{"id":56201},"messaging-fields","Messaging Fields",[35,56204,54378,56206,48940,56209],{"id":56205},"field-channel_id-channels",[109,56207,56208],{},"channel_id",[109,56210,56211],{},"channels",[35,56213,54378,56215,48940,56218],{"id":56214},"field-channel_ids-channels",[109,56216,56217],{},"channel_ids",[109,56219,56211],{},[72,56221,56222],{},[46,56223,56224,56225,56227,56228],{},"the reason was so we could include additional channel information, such as the channel ",[109,56226,637],{}," , as well as its ",[109,56229,2442],{},[19,56231,56232],{},[478,56233,55057],{},[72,56235,56236],{},[46,56237,56238,54868,56240],{},[109,56239,55388],{},[109,56241,55067],{},[19,56243,56244],{},[478,56245,54457],{},[102,56247,56249],{"className":220,"code":56248,"language":222,"meta":107,"style":107},"channel_id?: string; // @deprecated\n",[109,56250,56251],{"__ignoreMap":107},[112,56252,56253,56255,56257,56259],{"class":114,"line":115},[112,56254,56208],{"class":236},[112,56256,10309],{"class":229},[112,56258,54471],{"class":236},[112,56260,55583],{"class":578},[19,56262,56263],{},[478,56264,54479],{},[102,56266,56268],{"className":220,"code":56267,"language":222,"meta":107,"style":107},"channels?: IMessagingChannelMessage[]; // Represents the names of all channels to which the message is sent / belongs to\n",[109,56269,56270],{"__ignoreMap":107},[112,56271,56272,56274,56276,56279],{"class":114,"line":115},[112,56273,56211],{"class":236},[112,56275,10309],{"class":229},[112,56277,56278],{"class":236}," IMessagingChannelMessage[]; ",[112,56280,56281],{"class":578},"// Represents the names of all channels to which the message is sent / belongs to\n",[19,56283,56284],{},[478,56285,54500],{},[72,56287,56288,56300,56307],{},[46,56289,56290,54520,56292,56294,56295,9571,56297],{},[478,56291,54507],{},[109,56293,56211],{}," array instead of ",[109,56296,56208],{},[109,56298,56299],{},"channels_ids",[46,56301,56302,54520,56304,56306],{},[478,56303,54519],{},[109,56305,56211],{}," array when creating messages",[46,56308,56309,38500,56312,56314],{},[478,56310,56311],{},"Multi-Channel Support:",[109,56313,56211],{}," array supports messages posted to multiple channels (when the integration supports it)",[19,56316,56317],{},[478,56318,10603],{},[102,56320,56322],{"className":220,"code":56321,"language":222,"meta":107,"style":107},"// Before\nconst message = {\n    message: 'Hello',\n    channel_id: 'channel_123',\n    channels_ids: [\"channel_123\"]\n}\n\n// After\nconst message = {\n    message: 'Hello',\n    channels: [{\n        id: 'channel_123',\n        name: 'General'\n    }]\n}\n",[109,56323,56324,56328,56338,56347,56357,56367,56371,56375,56379,56389,56397,56402,56410,56417,56421],{"__ignoreMap":107},[112,56325,56326],{"class":114,"line":115},[112,56327,54540],{"class":578},[112,56329,56330,56332,56334,56336],{"class":114,"line":126},[112,56331,277],{"class":229},[112,56333,18826],{"class":129},[112,56335,354],{"class":229},[112,56337,280],{"class":236},[112,56339,56340,56342,56345],{"class":114,"line":135},[112,56341,55478],{"class":236},[112,56343,56344],{"class":122},"'Hello'",[112,56346,288],{"class":236},[112,56348,56349,56352,56355],{"class":114,"line":147},[112,56350,56351],{"class":236},"    channel_id: ",[112,56353,56354],{"class":122},"'channel_123'",[112,56356,288],{"class":236},[112,56358,56359,56362,56365],{"class":114,"line":202},[112,56360,56361],{"class":236},"    channels_ids: [",[112,56363,56364],{"class":122},"\"channel_123\"",[112,56366,2794],{"class":236},[112,56368,56369],{"class":114,"line":208},[112,56370,584],{"class":236},[112,56372,56373],{"class":114,"line":291},[112,56374,272],{"emptyLinePlaceholder":271},[112,56376,56377],{"class":114,"line":299},[112,56378,54579],{"class":578},[112,56380,56381,56383,56385,56387],{"class":114,"line":307},[112,56382,277],{"class":229},[112,56384,18826],{"class":129},[112,56386,354],{"class":229},[112,56388,280],{"class":236},[112,56390,56391,56393,56395],{"class":114,"line":315},[112,56392,55478],{"class":236},[112,56394,56344],{"class":122},[112,56396,288],{"class":236},[112,56398,56399],{"class":114,"line":323},[112,56400,56401],{"class":236},"    channels: [{\n",[112,56403,56404,56406,56408],{"class":114,"line":329},[112,56405,55718],{"class":236},[112,56407,56354],{"class":122},[112,56409,288],{"class":236},[112,56411,56412,56414],{"class":114,"line":341},[112,56413,55728],{"class":236},[112,56415,56416],{"class":122},"'General'\n",[112,56418,56419],{"class":114,"line":346},[112,56420,55746],{"class":236},[112,56422,56423],{"class":114,"line":366},[112,56424,584],{"class":236},[16,56426],{},[35,56428,54378,56430,56433],{"id":56429},"field-root_message_id-removed",[109,56431,56432],{},"root_message_id"," → Removed",[19,56435,56436],{},[478,56437,55057],{},[72,56439,56440],{},[46,56441,56442],{},[109,56443,55388],{},[19,56445,56446],{},[478,56447,54457],{},[102,56449,56451],{"className":220,"code":56450,"language":222,"meta":107,"style":107},"root_message_id?: string; // @deprecated\n",[109,56452,56453],{"__ignoreMap":107},[112,56454,56455,56457,56459,56461],{"class":114,"line":115},[112,56456,56432],{"class":236},[112,56458,10309],{"class":229},[112,56460,54471],{"class":236},[112,56462,55583],{"class":578},[19,56464,56465],{},[478,56466,54479],{},[72,56468,56469],{},[46,56470,56471,56472,56474],{},"No direct replacement. Use ",[109,56473,38430],{}," to traverse the thread structure.",[19,56476,56477],{},[478,56478,54500],{},[72,56480,56481,56491],{},[46,56482,56483,56485,56486,56488,56489],{},[478,56484,54507],{}," If you need to find the root message, traverse the ",[109,56487,38430],{}," chain until you reach a message without a ",[109,56490,38430],{},[46,56492,56493,56495,56496,56498],{},[478,56494,54519],{}," Remove references to ",[109,56497,56432],{}," when creating messages",[19,56500,56501],{},[478,56502,10603],{},[102,56504,56506],{"className":220,"code":56505,"language":222,"meta":107,"style":107},"// Before\nconst message = {\n    message: 'Reply',\n    parent_message_id: 'msg_123',\n    root_message_id: 'msg_1'\n}\n\n// After\nconst message = {\n    message: 'Reply',\n    parent_id: 'msg_123'\n    // root_message_id removed - traverse parent_id chain if needed\n}\n\n// Helper function to find root message\nfunction findRootMessage(message) {\n    while (message.parent_id) {\n        message = getMessage(message.parent_id);\n    }\n    return message;\n}\n",[109,56507,56508,56512,56522,56531,56540,56548,56552,56556,56560,56570,56578,56584,56589,56593,56597,56602,56616,56623,56636,56640,56647],{"__ignoreMap":107},[112,56509,56510],{"class":114,"line":115},[112,56511,54540],{"class":578},[112,56513,56514,56516,56518,56520],{"class":114,"line":126},[112,56515,277],{"class":229},[112,56517,18826],{"class":129},[112,56519,354],{"class":229},[112,56521,280],{"class":236},[112,56523,56524,56526,56529],{"class":114,"line":135},[112,56525,55478],{"class":236},[112,56527,56528],{"class":122},"'Reply'",[112,56530,288],{"class":236},[112,56532,56533,56535,56538],{"class":114,"line":147},[112,56534,55488],{"class":236},[112,56536,56537],{"class":122},"'msg_123'",[112,56539,288],{"class":236},[112,56541,56542,56545],{"class":114,"line":202},[112,56543,56544],{"class":236},"    root_message_id: ",[112,56546,56547],{"class":122},"'msg_1'\n",[112,56549,56550],{"class":114,"line":208},[112,56551,584],{"class":236},[112,56553,56554],{"class":114,"line":291},[112,56555,272],{"emptyLinePlaceholder":271},[112,56557,56558],{"class":114,"line":299},[112,56559,54579],{"class":578},[112,56561,56562,56564,56566,56568],{"class":114,"line":307},[112,56563,277],{"class":229},[112,56565,18826],{"class":129},[112,56567,354],{"class":229},[112,56569,280],{"class":236},[112,56571,56572,56574,56576],{"class":114,"line":315},[112,56573,55478],{"class":236},[112,56575,56528],{"class":122},[112,56577,288],{"class":236},[112,56579,56580,56582],{"class":114,"line":323},[112,56581,55036],{"class":236},[112,56583,55491],{"class":122},[112,56585,56586],{"class":114,"line":329},[112,56587,56588],{"class":578},"    // root_message_id removed - traverse parent_id chain if needed\n",[112,56590,56591],{"class":114,"line":341},[112,56592,584],{"class":236},[112,56594,56595],{"class":114,"line":346},[112,56596,272],{"emptyLinePlaceholder":271},[112,56598,56599],{"class":114,"line":366},[112,56600,56601],{"class":578},"// Helper function to find root message\n",[112,56603,56604,56606,56609,56611,56614],{"class":114,"line":381},[112,56605,9978],{"class":229},[112,56607,56608],{"class":118}," findRootMessage",[112,56610,456],{"class":236},[112,56612,56613],{"class":517},"message",[112,56615,526],{"class":236},[112,56617,56618,56620],{"class":114,"line":387},[112,56619,14461],{"class":229},[112,56621,56622],{"class":236}," (message.parent_id) {\n",[112,56624,56625,56628,56630,56633],{"class":114,"line":392},[112,56626,56627],{"class":236},"        message ",[112,56629,335],{"class":229},[112,56631,56632],{"class":118}," getMessage",[112,56634,56635],{"class":236},"(message.parent_id);\n",[112,56637,56638],{"class":114,"line":409},[112,56639,3946],{"class":236},[112,56641,56642,56644],{"class":114,"line":422},[112,56643,572],{"class":229},[112,56645,56646],{"class":236}," message;\n",[112,56648,56649],{"class":114,"line":435},[112,56650,584],{"class":236},[16,56652],{},[67,56654,54348],{"id":56655},"accounting-fields",[35,56657,54378,56659,48940,56662],{"id":56658},"field-invoice_at-posted_at",[109,56660,56661],{},"invoice_at",[109,56663,56664],{},"posted_at",[19,56666,56667],{},[478,56668,55057],{},[72,56670,56671],{},[46,56672,56673],{},[109,56674,56675],{},"IAccountingInvoice",[19,56677,56678],{},[478,56679,54457],{},[102,56681,56683],{"className":220,"code":56682,"language":222,"meta":107,"style":107},"invoice_at?: (string | Date | number); // @deprecated; use posted_at\n",[109,56684,56685],{"__ignoreMap":107},[112,56686,56687,56689,56691,56694,56697,56700,56702,56705],{"class":114,"line":115},[112,56688,56661],{"class":236},[112,56690,10309],{"class":229},[112,56692,56693],{"class":236}," (string ",[112,56695,56696],{"class":229},"|",[112,56698,56699],{"class":236}," Date ",[112,56701,56696],{"class":229},[112,56703,56704],{"class":236}," number); ",[112,56706,56707],{"class":578},"// @deprecated; use posted_at\n",[19,56709,56710],{},[478,56711,54479],{},[102,56713,56715],{"className":220,"code":56714,"language":222,"meta":107,"style":107},"posted_at?: (string | Date | number);\n",[109,56716,56717],{"__ignoreMap":107},[112,56718,56719,56721,56723,56725,56727,56729,56731],{"class":114,"line":115},[112,56720,56664],{"class":236},[112,56722,10309],{"class":229},[112,56724,56693],{"class":236},[112,56726,56696],{"class":229},[112,56728,56699],{"class":236},[112,56730,56696],{"class":229},[112,56732,56733],{"class":236}," number);\n",[19,56735,56736],{},[478,56737,54500],{},[72,56739,56740,56749,56756],{},[46,56741,56742,54520,56744,54523,56746,56748],{},[478,56743,54507],{},[109,56745,56664],{},[109,56747,56661],{}," when reading invoice objects",[46,56750,56751,54520,56753,56755],{},[478,56752,54519],{},[109,56754,56664],{}," when creating or updating invoices",[46,56757,56758,56761,56762,56764],{},[478,56759,56760],{},"Consistency:"," This change aligns with other accounting objects that use ",[109,56763,56664],{}," for transaction dates",[19,56766,56767],{},[478,56768,10603],{},[102,56770,56772],{"className":220,"code":56771,"language":222,"meta":107,"style":107},"// Before\nconst invoice = {\n    invoice_number: 'INV-001',\n    invoice_at: '2024-01-15'\n}\n\n// After\nconst invoice = {\n    invoice_number: 'INV-001',\n    posted_at: '2024-01-15'\n}\n",[109,56773,56774,56778,56789,56799,56807,56811,56815,56819,56829,56837,56844],{"__ignoreMap":107},[112,56775,56776],{"class":114,"line":115},[112,56777,54540],{"class":578},[112,56779,56780,56782,56785,56787],{"class":114,"line":126},[112,56781,277],{"class":229},[112,56783,56784],{"class":129}," invoice",[112,56786,354],{"class":229},[112,56788,280],{"class":236},[112,56790,56791,56794,56797],{"class":114,"line":135},[112,56792,56793],{"class":236},"    invoice_number: ",[112,56795,56796],{"class":122},"'INV-001'",[112,56798,288],{"class":236},[112,56800,56801,56804],{"class":114,"line":147},[112,56802,56803],{"class":236},"    invoice_at: ",[112,56805,56806],{"class":122},"'2024-01-15'\n",[112,56808,56809],{"class":114,"line":202},[112,56810,584],{"class":236},[112,56812,56813],{"class":114,"line":208},[112,56814,272],{"emptyLinePlaceholder":271},[112,56816,56817],{"class":114,"line":291},[112,56818,54579],{"class":578},[112,56820,56821,56823,56825,56827],{"class":114,"line":299},[112,56822,277],{"class":229},[112,56824,56784],{"class":129},[112,56826,354],{"class":229},[112,56828,280],{"class":236},[112,56830,56831,56833,56835],{"class":114,"line":307},[112,56832,56793],{"class":236},[112,56834,56796],{"class":122},[112,56836,288],{"class":236},[112,56838,56839,56842],{"class":114,"line":315},[112,56840,56841],{"class":236},"    posted_at: ",[112,56843,56806],{"class":122},[112,56845,56846],{"class":114,"line":323},[112,56847,584],{"class":236},[16,56849],{},[35,56851,54378,56853,56433],{"id":56852},"field-type-removed",[109,56854,2472],{},[19,56856,56857],{},[478,56858,55057],{},[72,56860,56861],{},[46,56862,56863],{},[109,56864,56675],{},[19,56866,56867],{},[478,56868,54457],{},[102,56870,56872],{"className":220,"code":56871,"language":222,"meta":107,"style":107},"type?: TAccountingInvoiceType; // @deprecated\n",[109,56873,56874],{"__ignoreMap":107},[112,56875,56876,56878,56880,56883],{"class":114,"line":115},[112,56877,2472],{"class":236},[112,56879,10309],{"class":229},[112,56881,56882],{"class":236}," TAccountingInvoiceType; ",[112,56884,55583],{"class":578},[19,56886,56887],{},[478,56888,54479],{},[72,56890,56891],{},[46,56892,56893],{},"No direct replacement. Bills are now found in the AccountingBill object, while invoices are solely in the AccountingInvoice object.",[19,56895,56896],{},[478,56897,54500],{},[72,56899,56900,56908],{},[46,56901,56902,56904,56905,15473],{},[478,56903,54507],{}," Remove dependencies on ",[109,56906,56907],{},"invoice.type",[46,56909,56910,56913],{},[478,56911,56912],{},"Alternative:"," Bills are now found in the AccountingBill object, while invoices are solely in the AccountingInvoice object.",[16,56915],{},[35,56917,54378,56919,48940,56922],{"id":56918},"field-contact_id-contacts",[109,56920,56921],{},"contact_id",[109,56923,42725],{},[19,56925,56926],{},[478,56927,55057],{},[72,56929,56930],{},[46,56931,56932,54868,56935],{},[109,56933,56934],{},"IAccountingTransaction",[109,56936,56937],{},"src/models/UnifiedAccounting.ts",[19,56939,56940],{},[478,56941,54457],{},[102,56943,56945],{"className":220,"code":56944,"language":222,"meta":107,"style":107},"contact_id?: string; // @deprecated; use contacts\n",[109,56946,56947],{"__ignoreMap":107},[112,56948,56949,56951,56953,56955],{"class":114,"line":115},[112,56950,56921],{"class":236},[112,56952,10309],{"class":229},[112,56954,54471],{"class":236},[112,56956,56957],{"class":578},"// @deprecated; use contacts\n",[19,56959,56960],{},[478,56961,54479],{},[102,56963,56965],{"className":220,"code":56964,"language":222,"meta":107,"style":107},"contacts?: IAccountingTransactionContact[];\n",[109,56966,56967],{"__ignoreMap":107},[112,56968,56969,56971,56973],{"class":114,"line":115},[112,56970,42725],{"class":236},[112,56972,10309],{"class":229},[112,56974,56975],{"class":236}," IAccountingTransactionContact[];\n",[19,56977,56978],{},[478,56979,54500],{},[72,56981,56982,56990,56999,57007],{},[46,56983,56984,54520,56986,56294,56988],{},[478,56985,54507],{},[109,56987,42725],{},[109,56989,56921],{},[46,56991,56992,54520,56994,56996,56997,15473],{},[478,56993,54519],{},[109,56995,42725],{}," array when creating transactions, but just include an ",[109,56998,2442],{},[46,57000,57001,38500,57004,57006],{},[478,57002,57003],{},"Multi-Contact Support:",[109,57005,42725],{}," array supports multiple contacts per transaction (when the integration supports multiple contacts)",[46,57008,57009,57011],{},[478,57010,56028],{}," Provides contact names and emails, not just IDs",[19,57013,57014],{},[478,57015,10603],{},[102,57017,57019],{"className":220,"code":57018,"language":222,"meta":107,"style":107},"// Before\nconst transaction = {\n    total_amount: 1000,\n    contact_id: 'contact_123'\n}\n\n// After\nconst transaction = {\n    total_amount: 1000,\n    contacts: [{\n        id: 'contact_123',\n        name: 'Acme Corp',\n        emails: [{\n            email: 'billing@acme.com'\n        }]\n    }]\n}\n",[109,57020,57021,57025,57036,57045,57053,57057,57061,57065,57075,57083,57088,57097,57106,57111,57119,57124,57128],{"__ignoreMap":107},[112,57022,57023],{"class":114,"line":115},[112,57024,54540],{"class":578},[112,57026,57027,57029,57032,57034],{"class":114,"line":126},[112,57028,277],{"class":229},[112,57030,57031],{"class":129}," transaction",[112,57033,354],{"class":229},[112,57035,280],{"class":236},[112,57037,57038,57041,57043],{"class":114,"line":135},[112,57039,57040],{"class":236},"    total_amount: ",[112,57042,21263],{"class":129},[112,57044,288],{"class":236},[112,57046,57047,57050],{"class":114,"line":147},[112,57048,57049],{"class":236},"    contact_id: ",[112,57051,57052],{"class":122},"'contact_123'\n",[112,57054,57055],{"class":114,"line":202},[112,57056,584],{"class":236},[112,57058,57059],{"class":114,"line":208},[112,57060,272],{"emptyLinePlaceholder":271},[112,57062,57063],{"class":114,"line":291},[112,57064,54579],{"class":578},[112,57066,57067,57069,57071,57073],{"class":114,"line":299},[112,57068,277],{"class":229},[112,57070,57031],{"class":129},[112,57072,354],{"class":229},[112,57074,280],{"class":236},[112,57076,57077,57079,57081],{"class":114,"line":307},[112,57078,57040],{"class":236},[112,57080,21263],{"class":129},[112,57082,288],{"class":236},[112,57084,57085],{"class":114,"line":315},[112,57086,57087],{"class":236},"    contacts: [{\n",[112,57089,57090,57092,57095],{"class":114,"line":323},[112,57091,55718],{"class":236},[112,57093,57094],{"class":122},"'contact_123'",[112,57096,288],{"class":236},[112,57098,57099,57101,57104],{"class":114,"line":329},[112,57100,55728],{"class":236},[112,57102,57103],{"class":122},"'Acme Corp'",[112,57105,288],{"class":236},[112,57107,57108],{"class":114,"line":341},[112,57109,57110],{"class":236},"        emails: [{\n",[112,57112,57113,57116],{"class":114,"line":346},[112,57114,57115],{"class":236},"            email: ",[112,57117,57118],{"class":122},"'billing@acme.com'\n",[112,57120,57121],{"class":114,"line":366},[112,57122,57123],{"class":236},"        }]\n",[112,57125,57126],{"class":114,"line":381},[112,57127,55746],{"class":236},[112,57129,57130],{"class":114,"line":387},[112,57131,584],{"class":236},[16,57133],{},[35,57135,54378,57137,48940,57140],{"id":57136},"field-income-income_sections",[109,57138,57139],{},"income",[109,57141,57142],{},"income_sections",[19,57144,57145],{},[478,57146,55057],{},[72,57148,57149],{},[46,57150,57151,54868,57154],{},[109,57152,57153],{},"IAccountingProfitloss",[109,57155,56937],{},[19,57157,57158],{},[478,57159,54457],{},[102,57161,57163],{"className":220,"code":57162,"language":222,"meta":107,"style":107},"income?: IAccountingProfitlossCategory[]; // @deprecated – use income_sections instead\n",[109,57164,57165],{"__ignoreMap":107},[112,57166,57167,57169,57171,57174],{"class":114,"line":115},[112,57168,57139],{"class":236},[112,57170,10309],{"class":229},[112,57172,57173],{"class":236}," IAccountingProfitlossCategory[]; ",[112,57175,57176],{"class":578},"// @deprecated – use income_sections instead\n",[19,57178,57179],{},[478,57180,54479],{},[102,57182,57184],{"className":220,"code":57183,"language":222,"meta":107,"style":107},"income_sections?: IAccountingProfitlossSection[];\n",[109,57185,57186],{"__ignoreMap":107},[112,57187,57188,57190,57192],{"class":114,"line":115},[112,57189,57142],{"class":236},[112,57191,10309],{"class":229},[112,57193,57194],{"class":236}," IAccountingProfitlossSection[];\n",[19,57196,57197],{},[478,57198,54500],{},[72,57200,57201,57209,57216],{},[46,57202,57203,54520,57205,54523,57207],{},[478,57204,54507],{},[109,57206,57142],{},[109,57208,57139],{},[46,57210,57211,54520,57213,57215],{},[478,57212,54519],{},[109,57214,57142],{}," when creating profit/loss reports",[46,57217,57218,57221,57222,57224],{},[478,57219,57220],{},"Enhanced Structure:"," The new ",[109,57223,57142],{}," provides a more structured format with better categorization",[19,57226,57227],{},[478,57228,10603],{},[102,57230,57232],{"className":220,"code":57231,"language":222,"meta":107,"style":107},"// Before\nconst profitloss = {\n    start_at: '2024-01-01',\n    end_at: '2024-12-31',\n    income: [{\n        name: 'Sales',\n        amount: 100000\n    }]\n}\n\n// After\nconst profitloss = {\n    start_at: '2024-01-01',\n    end_at: '2024-12-31',\n    income_sections: [{\n        name: 'Sales',\n        accounts: [{\n            name: 'Product Sales',\n            amount: 100000\n        }]\n    }]\n}\n",[109,57233,57234,57238,57249,57259,57269,57274,57283,57291,57295,57299,57303,57307,57317,57325,57333,57338,57346,57351,57360,57367,57371,57375],{"__ignoreMap":107},[112,57235,57236],{"class":114,"line":115},[112,57237,54540],{"class":578},[112,57239,57240,57242,57245,57247],{"class":114,"line":126},[112,57241,277],{"class":229},[112,57243,57244],{"class":129}," profitloss",[112,57246,354],{"class":229},[112,57248,280],{"class":236},[112,57250,57251,57254,57257],{"class":114,"line":135},[112,57252,57253],{"class":236},"    start_at: ",[112,57255,57256],{"class":122},"'2024-01-01'",[112,57258,288],{"class":236},[112,57260,57261,57264,57267],{"class":114,"line":147},[112,57262,57263],{"class":236},"    end_at: ",[112,57265,57266],{"class":122},"'2024-12-31'",[112,57268,288],{"class":236},[112,57270,57271],{"class":114,"line":202},[112,57272,57273],{"class":236},"    income: [{\n",[112,57275,57276,57278,57281],{"class":114,"line":208},[112,57277,55728],{"class":236},[112,57279,57280],{"class":122},"'Sales'",[112,57282,288],{"class":236},[112,57284,57285,57288],{"class":114,"line":291},[112,57286,57287],{"class":236},"        amount: ",[112,57289,57290],{"class":129},"100000\n",[112,57292,57293],{"class":114,"line":299},[112,57294,55746],{"class":236},[112,57296,57297],{"class":114,"line":307},[112,57298,584],{"class":236},[112,57300,57301],{"class":114,"line":315},[112,57302,272],{"emptyLinePlaceholder":271},[112,57304,57305],{"class":114,"line":323},[112,57306,54579],{"class":578},[112,57308,57309,57311,57313,57315],{"class":114,"line":329},[112,57310,277],{"class":229},[112,57312,57244],{"class":129},[112,57314,354],{"class":229},[112,57316,280],{"class":236},[112,57318,57319,57321,57323],{"class":114,"line":341},[112,57320,57253],{"class":236},[112,57322,57256],{"class":122},[112,57324,288],{"class":236},[112,57326,57327,57329,57331],{"class":114,"line":346},[112,57328,57263],{"class":236},[112,57330,57266],{"class":122},[112,57332,288],{"class":236},[112,57334,57335],{"class":114,"line":366},[112,57336,57337],{"class":236},"    income_sections: [{\n",[112,57339,57340,57342,57344],{"class":114,"line":381},[112,57341,55728],{"class":236},[112,57343,57280],{"class":122},[112,57345,288],{"class":236},[112,57347,57348],{"class":114,"line":387},[112,57349,57350],{"class":236},"        accounts: [{\n",[112,57352,57353,57355,57358],{"class":114,"line":392},[112,57354,26848],{"class":236},[112,57356,57357],{"class":122},"'Product Sales'",[112,57359,288],{"class":236},[112,57361,57362,57365],{"class":114,"line":409},[112,57363,57364],{"class":236},"            amount: ",[112,57366,57290],{"class":129},[112,57368,57369],{"class":114,"line":422},[112,57370,57123],{"class":236},[112,57372,57373],{"class":114,"line":435},[112,57374,55746],{"class":236},[112,57376,57377],{"class":114,"line":440},[112,57378,584],{"class":236},[16,57380],{},[35,57382,55756,57384,48940,57387],{"id":57383},"fieldexpenses-expenses_sections",[109,57385,57386],{},"expenses",[109,57388,57389],{},"expenses_sections",[19,57391,57392],{},[478,57393,55057],{},[72,57395,57396],{},[46,57397,57398],{},[109,57399,57153],{},[19,57401,57402],{},[478,57403,54457],{},[102,57405,57407],{"className":220,"code":57406,"language":222,"meta":107,"style":107},"expenses?: IAccountingProfitlossCategory[]; // @deprecated – use expenses_sections instead\n",[109,57408,57409],{"__ignoreMap":107},[112,57410,57411,57413,57415,57417],{"class":114,"line":115},[112,57412,57386],{"class":236},[112,57414,10309],{"class":229},[112,57416,57173],{"class":236},[112,57418,57419],{"class":578},"// @deprecated – use expenses_sections instead\n",[19,57421,57422],{},[478,57423,54479],{},[102,57425,57427],{"className":220,"code":57426,"language":222,"meta":107,"style":107},"expenses_sections?: IAccountingProfitlossSection[];\n",[109,57428,57429],{"__ignoreMap":107},[112,57430,57431,57433,57435],{"class":114,"line":115},[112,57432,57389],{"class":236},[112,57434,10309],{"class":229},[112,57436,57194],{"class":236},[19,57438,57439],{},[478,57440,54500],{},[72,57442,57443,57451],{},[46,57444,57445,54520,57447,54523,57449],{},[478,57446,54507],{},[109,57448,57389],{},[109,57450,57386],{},[46,57452,57453,54520,57455,57215],{},[478,57454,54519],{},[109,57456,57389],{},[19,57458,57459],{},[478,57460,10603],{},[102,57462,57464],{"className":220,"code":57463,"language":222,"meta":107,"style":107},"// Before\nconst profitloss = {\n    expenses: [{\n        name: 'Operating Expenses',\n        amount: 50000\n    }]\n}\n\n// After\nconst profitloss = {\n    expenses_sections: [{\n        name: 'Operating Expenses',\n        accounts: [{\n            name: 'Salaries',\n            amount: 50000\n        }]\n    }]\n}\n",[109,57465,57466,57470,57480,57485,57494,57501,57505,57509,57513,57517,57527,57532,57540,57544,57553,57559,57563,57567],{"__ignoreMap":107},[112,57467,57468],{"class":114,"line":115},[112,57469,54540],{"class":578},[112,57471,57472,57474,57476,57478],{"class":114,"line":126},[112,57473,277],{"class":229},[112,57475,57244],{"class":129},[112,57477,354],{"class":229},[112,57479,280],{"class":236},[112,57481,57482],{"class":114,"line":135},[112,57483,57484],{"class":236},"    expenses: [{\n",[112,57486,57487,57489,57492],{"class":114,"line":147},[112,57488,55728],{"class":236},[112,57490,57491],{"class":122},"'Operating Expenses'",[112,57493,288],{"class":236},[112,57495,57496,57498],{"class":114,"line":202},[112,57497,57287],{"class":236},[112,57499,57500],{"class":129},"50000\n",[112,57502,57503],{"class":114,"line":208},[112,57504,55746],{"class":236},[112,57506,57507],{"class":114,"line":291},[112,57508,584],{"class":236},[112,57510,57511],{"class":114,"line":299},[112,57512,272],{"emptyLinePlaceholder":271},[112,57514,57515],{"class":114,"line":307},[112,57516,54579],{"class":578},[112,57518,57519,57521,57523,57525],{"class":114,"line":315},[112,57520,277],{"class":229},[112,57522,57244],{"class":129},[112,57524,354],{"class":229},[112,57526,280],{"class":236},[112,57528,57529],{"class":114,"line":323},[112,57530,57531],{"class":236},"    expenses_sections: [{\n",[112,57533,57534,57536,57538],{"class":114,"line":329},[112,57535,55728],{"class":236},[112,57537,57491],{"class":122},[112,57539,288],{"class":236},[112,57541,57542],{"class":114,"line":341},[112,57543,57350],{"class":236},[112,57545,57546,57548,57551],{"class":114,"line":346},[112,57547,26848],{"class":236},[112,57549,57550],{"class":122},"'Salaries'",[112,57552,288],{"class":236},[112,57554,57555,57557],{"class":114,"line":366},[112,57556,57364],{"class":236},[112,57558,57500],{"class":129},[112,57560,57561],{"class":114,"line":381},[112,57562,57123],{"class":236},[112,57564,57565],{"class":114,"line":387},[112,57566,55746],{"class":236},[112,57568,57569],{"class":114,"line":392},[112,57570,584],{"class":236},[16,57572],{},[35,57574,55756,57576,48940,57579],{"id":57575},"fieldcost_of_goods_sold-cost_of_goods_sold_sections",[109,57577,57578],{},"cost_of_goods_sold",[109,57580,57581],{},"cost_of_goods_sold_sections",[19,57583,57584],{},[478,57585,55057],{},[72,57587,57588],{},[46,57589,57590],{},[109,57591,57153],{},[19,57593,57594],{},[478,57595,54457],{},[102,57597,57599],{"className":220,"code":57598,"language":222,"meta":107,"style":107},"cost_of_goods_sold?: IAccountingProfitlossCategory[]; // @deprecated – use cost_of_goods_sold_sections instead\n",[109,57600,57601],{"__ignoreMap":107},[112,57602,57603,57605,57607,57609],{"class":114,"line":115},[112,57604,57578],{"class":236},[112,57606,10309],{"class":229},[112,57608,57173],{"class":236},[112,57610,57611],{"class":578},"// @deprecated – use cost_of_goods_sold_sections instead\n",[19,57613,57614],{},[478,57615,54479],{},[102,57617,57619],{"className":220,"code":57618,"language":222,"meta":107,"style":107},"cost_of_goods_sold_sections?: IAccountingProfitlossSection[];\n",[109,57620,57621],{"__ignoreMap":107},[112,57622,57623,57625,57627],{"class":114,"line":115},[112,57624,57581],{"class":236},[112,57626,10309],{"class":229},[112,57628,57194],{"class":236},[19,57630,57631],{},[478,57632,54500],{},[72,57634,57635,57643],{},[46,57636,57637,54520,57639,54523,57641],{},[478,57638,54507],{},[109,57640,57581],{},[109,57642,57578],{},[46,57644,57645,54520,57647,57215],{},[478,57646,54519],{},[109,57648,57581],{},[19,57650,57651],{},[478,57652,10603],{},[102,57654,57656],{"className":220,"code":57655,"language":222,"meta":107,"style":107},"// Before\nconst profitloss = {\n    cost_of_goods_sold: [{\n        name: 'Materials',\n        amount: 30000\n    }]\n}\n\n// After\nconst profitloss = {\n    cost_of_goods_sold_sections: [{\n        name: 'Materials',\n        accounts: [{\n            name: 'Raw Materials',\n            amount: 30000\n        }]\n    }]\n}\n",[109,57657,57658,57662,57672,57677,57686,57693,57697,57701,57705,57709,57719,57724,57732,57736,57745,57751,57755,57759],{"__ignoreMap":107},[112,57659,57660],{"class":114,"line":115},[112,57661,54540],{"class":578},[112,57663,57664,57666,57668,57670],{"class":114,"line":126},[112,57665,277],{"class":229},[112,57667,57244],{"class":129},[112,57669,354],{"class":229},[112,57671,280],{"class":236},[112,57673,57674],{"class":114,"line":135},[112,57675,57676],{"class":236},"    cost_of_goods_sold: [{\n",[112,57678,57679,57681,57684],{"class":114,"line":147},[112,57680,55728],{"class":236},[112,57682,57683],{"class":122},"'Materials'",[112,57685,288],{"class":236},[112,57687,57688,57690],{"class":114,"line":202},[112,57689,57287],{"class":236},[112,57691,57692],{"class":129},"30000\n",[112,57694,57695],{"class":114,"line":208},[112,57696,55746],{"class":236},[112,57698,57699],{"class":114,"line":291},[112,57700,584],{"class":236},[112,57702,57703],{"class":114,"line":299},[112,57704,272],{"emptyLinePlaceholder":271},[112,57706,57707],{"class":114,"line":307},[112,57708,54579],{"class":578},[112,57710,57711,57713,57715,57717],{"class":114,"line":315},[112,57712,277],{"class":229},[112,57714,57244],{"class":129},[112,57716,354],{"class":229},[112,57718,280],{"class":236},[112,57720,57721],{"class":114,"line":323},[112,57722,57723],{"class":236},"    cost_of_goods_sold_sections: [{\n",[112,57725,57726,57728,57730],{"class":114,"line":329},[112,57727,55728],{"class":236},[112,57729,57683],{"class":122},[112,57731,288],{"class":236},[112,57733,57734],{"class":114,"line":341},[112,57735,57350],{"class":236},[112,57737,57738,57740,57743],{"class":114,"line":346},[112,57739,26848],{"class":236},[112,57741,57742],{"class":122},"'Raw Materials'",[112,57744,288],{"class":236},[112,57746,57747,57749],{"class":114,"line":366},[112,57748,57364],{"class":236},[112,57750,57692],{"class":129},[112,57752,57753],{"class":114,"line":381},[112,57754,57123],{"class":236},[112,57756,57757],{"class":114,"line":387},[112,57758,55746],{"class":236},[112,57760,57761],{"class":114,"line":392},[112,57762,584],{"class":236},[16,57764],{},[35,57766,55756,57768,57771,57772,11338,57775],{"id":57767},"fieldgross_profit_amount-calculate-from-income_total_amount-and-cost_of_goods_sold_total_amount",[109,57769,57770],{},"gross_profit_amount"," → Calculate from ",[109,57773,57774],{},"income_total_amount",[109,57776,57777],{},"cost_of_goods_sold_total_amount",[19,57779,57780],{},[478,57781,55057],{},[72,57783,57784],{},[46,57785,57786],{},[109,57787,57153],{},[19,57789,57790],{},[478,57791,54457],{},[102,57793,57795],{"className":220,"code":57794,"language":222,"meta":107,"style":107},"gross_profit_amount?: number; // @deprecated – compute using income_total_amount - cost_of_goods_sold_total_amount\n",[109,57796,57797],{"__ignoreMap":107},[112,57798,57799,57801,57803,57806],{"class":114,"line":115},[112,57800,57770],{"class":236},[112,57802,10309],{"class":229},[112,57804,57805],{"class":236}," number; ",[112,57807,57808],{"class":578},"// @deprecated – compute using income_total_amount - cost_of_goods_sold_total_amount\n",[19,57810,57811],{},[478,57812,54479],{},[102,57814,57816],{"className":220,"code":57815,"language":222,"meta":107,"style":107},"gross_profit_amount = income_total_amount - cost_of_goods_sold_total_amount\n",[109,57817,57818],{"__ignoreMap":107},[112,57819,57820,57823,57825,57828,57830],{"class":114,"line":115},[112,57821,57822],{"class":236},"gross_profit_amount ",[112,57824,335],{"class":229},[112,57826,57827],{"class":236}," income_total_amount ",[112,57829,23301],{"class":229},[112,57831,57832],{"class":236}," cost_of_goods_sold_total_amount\n",[19,57834,57835],{},[478,57836,54500],{},[72,57838,57839,57850],{},[46,57840,57841,57843,57844,57846,57847],{},[478,57842,54507],{}," Calculate ",[109,57845,57770],{}," using ",[109,57848,57849],{},"income_total_amount - cost_of_goods_sold_total_amount",[46,57851,57852,57854,57855,57857],{},[478,57853,54519],{}," Do not set ",[109,57856,57770],{}," directly",[19,57859,57860],{},[478,57861,10603],{},[102,57863,57865],{"className":220,"code":57864,"language":222,"meta":107,"style":107},"// Before\nconst profitloss = {\n    income_total_amount: 100000,\n    cost_of_goods_sold_total_amount: 30000,\n    gross_profit_amount: 70000\n}\n\n// After\nconst profitloss = {\n    income_total_amount: 100000,\n    cost_of_goods_sold_total_amount: 30000\n    // gross_profit_amount removed - calculate it\n}\n\n// Calculate gross profit\nconst gross_profit_amount = profitloss.income_total_amount - profitloss.cost_of_goods_sold_total_amount;\n",[109,57866,57867,57871,57881,57891,57901,57909,57913,57917,57921,57931,57939,57945,57950,57954,57958,57963],{"__ignoreMap":107},[112,57868,57869],{"class":114,"line":115},[112,57870,54540],{"class":578},[112,57872,57873,57875,57877,57879],{"class":114,"line":126},[112,57874,277],{"class":229},[112,57876,57244],{"class":129},[112,57878,354],{"class":229},[112,57880,280],{"class":236},[112,57882,57883,57886,57889],{"class":114,"line":135},[112,57884,57885],{"class":236},"    income_total_amount: ",[112,57887,57888],{"class":129},"100000",[112,57890,288],{"class":236},[112,57892,57893,57896,57899],{"class":114,"line":147},[112,57894,57895],{"class":236},"    cost_of_goods_sold_total_amount: ",[112,57897,57898],{"class":129},"30000",[112,57900,288],{"class":236},[112,57902,57903,57906],{"class":114,"line":202},[112,57904,57905],{"class":236},"    gross_profit_amount: ",[112,57907,57908],{"class":129},"70000\n",[112,57910,57911],{"class":114,"line":208},[112,57912,584],{"class":236},[112,57914,57915],{"class":114,"line":291},[112,57916,272],{"emptyLinePlaceholder":271},[112,57918,57919],{"class":114,"line":299},[112,57920,54579],{"class":578},[112,57922,57923,57925,57927,57929],{"class":114,"line":307},[112,57924,277],{"class":229},[112,57926,57244],{"class":129},[112,57928,354],{"class":229},[112,57930,280],{"class":236},[112,57932,57933,57935,57937],{"class":114,"line":315},[112,57934,57885],{"class":236},[112,57936,57888],{"class":129},[112,57938,288],{"class":236},[112,57940,57941,57943],{"class":114,"line":323},[112,57942,57895],{"class":236},[112,57944,57692],{"class":129},[112,57946,57947],{"class":114,"line":329},[112,57948,57949],{"class":578},"    // gross_profit_amount removed - calculate it\n",[112,57951,57952],{"class":114,"line":341},[112,57953,584],{"class":236},[112,57955,57956],{"class":114,"line":346},[112,57957,272],{"emptyLinePlaceholder":271},[112,57959,57960],{"class":114,"line":366},[112,57961,57962],{"class":578},"// Calculate gross profit\n",[112,57964,57965,57967,57970,57972,57975,57977],{"class":114,"line":381},[112,57966,277],{"class":229},[112,57968,57969],{"class":129}," gross_profit_amount",[112,57971,354],{"class":229},[112,57973,57974],{"class":236}," profitloss.income_total_amount ",[112,57976,23301],{"class":229},[112,57978,57979],{"class":236}," profitloss.cost_of_goods_sold_total_amount;\n",[16,57981],{},[35,57983,54378,57985,48940,57988],{"id":57984},"field-net_profit_amount-net_income_amount",[109,57986,57987],{},"net_profit_amount",[109,57989,57990],{},"net_income_amount",[19,57992,57993],{},[478,57994,55057],{},[72,57996,57997],{},[46,57998,57999],{},[109,58000,57153],{},[19,58002,58003],{},[478,58004,54457],{},[102,58006,58008],{"className":220,"code":58007,"language":222,"meta":107,"style":107},"net_profit_amount?: number; // @deprecated – use net_income_amount instead\n",[109,58009,58010],{"__ignoreMap":107},[112,58011,58012,58014,58016,58018],{"class":114,"line":115},[112,58013,57987],{"class":236},[112,58015,10309],{"class":229},[112,58017,57805],{"class":236},[112,58019,58020],{"class":578},"// @deprecated – use net_income_amount instead\n",[19,58022,58023],{},[478,58024,54479],{},[102,58026,58028],{"className":220,"code":58027,"language":222,"meta":107,"style":107},"net_income_amount?: number;\n",[109,58029,58030],{"__ignoreMap":107},[112,58031,58032,58034,58036],{"class":114,"line":115},[112,58033,57990],{"class":236},[112,58035,10309],{"class":229},[112,58037,58038],{"class":236}," number;\n",[19,58040,58041],{},[478,58042,54500],{},[72,58044,58045,58053],{},[46,58046,58047,54520,58049,54523,58051],{},[478,58048,54507],{},[109,58050,57990],{},[109,58052,57987],{},[46,58054,58055,54520,58057,57215],{},[478,58056,54519],{},[109,58058,57990],{},[19,58060,58061],{},[478,58062,10603],{},[102,58064,58066],{"className":220,"code":58065,"language":222,"meta":107,"style":107},"// Before\nconst profitloss = {\n    net_profit_amount: 50000\n}\n\n// After\nconst profitloss = {\n    net_income_amount: 50000\n}\n",[109,58067,58068,58072,58082,58089,58093,58097,58101,58111,58118],{"__ignoreMap":107},[112,58069,58070],{"class":114,"line":115},[112,58071,54540],{"class":578},[112,58073,58074,58076,58078,58080],{"class":114,"line":126},[112,58075,277],{"class":229},[112,58077,57244],{"class":129},[112,58079,354],{"class":229},[112,58081,280],{"class":236},[112,58083,58084,58087],{"class":114,"line":135},[112,58085,58086],{"class":236},"    net_profit_amount: ",[112,58088,57500],{"class":129},[112,58090,58091],{"class":114,"line":147},[112,58092,584],{"class":236},[112,58094,58095],{"class":114,"line":202},[112,58096,272],{"emptyLinePlaceholder":271},[112,58098,58099],{"class":114,"line":208},[112,58100,54579],{"class":578},[112,58102,58103,58105,58107,58109],{"class":114,"line":291},[112,58104,277],{"class":229},[112,58106,57244],{"class":129},[112,58108,354],{"class":229},[112,58110,280],{"class":236},[112,58112,58113,58116],{"class":114,"line":299},[112,58114,58115],{"class":236},"    net_income_amount: ",[112,58117,57500],{"class":129},[112,58119,58120],{"class":114,"line":307},[112,58121,584],{"class":236},[16,58123],{},[35,58125,54378,58127,11338,58130,58133],{"id":58126},"field-iaccountingprofitlosscategory-and-iaccountingprofitlosssubcategory-deprecated-types",[109,58128,58129],{},"IAccountingProfitlossCategory",[109,58131,58132],{},"IAccountingProfitlossSubcategory"," → Deprecated Types",[19,58135,58136],{},[478,58137,58138],{},"Deprecated Types:",[72,58140,58141,58146],{},[46,58142,58143,58145],{},[109,58144,58129],{}," - @deprecated",[46,58147,58148,58145],{},[109,58149,58132],{},[19,58151,58152],{},[478,58153,54479],{},[72,58155,58156],{},[46,58157,41287,58158,58161],{},[109,58159,58160],{},"IAccountingProfitlossSection"," instead",[19,58163,58164],{},[478,58165,54500],{},[72,58167,58168,58176],{},[46,58169,58170,58173,58174],{},[478,58171,58172],{},"Type Definitions:"," Update TypeScript interfaces to use ",[109,58175,58160],{},[46,58177,58178,54520,58180,1046,58182,14246,58184,58186],{},[478,58179,54507],{},[109,58181,57142],{},[109,58183,57389],{},[109,58185,57581],{}," which use the new section structure",[19,58188,58189],{},[478,58190,10603],{},[102,58192,58194],{"className":220,"code":58193,"language":222,"meta":107,"style":107},"// Before\ninterface Profitloss {\n    income?: IAccountingProfitlossCategory[];\n}\n\n// After\ninterface Profitloss {\n    income_sections?: IAccountingProfitlossSection[];\n}\n",[109,58195,58196,58200,58209,58221,58225,58229,58233,58241,58253],{"__ignoreMap":107},[112,58197,58198],{"class":114,"line":115},[112,58199,54540],{"class":578},[112,58201,58202,58204,58207],{"class":114,"line":126},[112,58203,10296],{"class":229},[112,58205,58206],{"class":118}," Profitloss",[112,58208,280],{"class":236},[112,58210,58211,58214,58216,58219],{"class":114,"line":135},[112,58212,58213],{"class":517},"    income",[112,58215,10309],{"class":229},[112,58217,58218],{"class":118}," IAccountingProfitlossCategory",[112,58220,10420],{"class":236},[112,58222,58223],{"class":114,"line":147},[112,58224,584],{"class":236},[112,58226,58227],{"class":114,"line":202},[112,58228,272],{"emptyLinePlaceholder":271},[112,58230,58231],{"class":114,"line":208},[112,58232,54579],{"class":578},[112,58234,58235,58237,58239],{"class":114,"line":291},[112,58236,10296],{"class":229},[112,58238,58206],{"class":118},[112,58240,280],{"class":236},[112,58242,58243,58246,58248,58251],{"class":114,"line":299},[112,58244,58245],{"class":517},"    income_sections",[112,58247,10309],{"class":229},[112,58249,58250],{"class":118}," IAccountingProfitlossSection",[112,58252,10420],{"class":236},[112,58254,58255],{"class":114,"line":307},[112,58256,584],{"class":236},[16,58258],{},[67,58260,54351],{"id":58261},"ats-applicant-tracking-system-fields",[35,58263,55756,58265,48940,58268],{"id":58264},"fielddocument_id-document_ids",[109,58266,58267],{},"document_id",[109,58269,58270],{},"document_ids",[19,58272,58273],{},[478,58274,55057],{},[72,58276,58277],{},[46,58278,58279,54868,58282],{},[109,58280,58281],{},"IAtsActivity",[109,58283,54434],{},[19,58285,58286],{},[478,58287,54457],{},[102,58289,58291],{"className":220,"code":58290,"language":222,"meta":107,"style":107},"document_id?: string; // @deprecated\n",[109,58292,58293],{"__ignoreMap":107},[112,58294,58295,58297,58299,58301],{"class":114,"line":115},[112,58296,58267],{"class":236},[112,58298,10309],{"class":229},[112,58300,54471],{"class":236},[112,58302,55583],{"class":578},[19,58304,58305],{},[478,58306,54479],{},[102,58308,58310],{"className":220,"code":58309,"language":222,"meta":107,"style":107},"document_ids?: string[]; // IDs for AtsDocument.get\n",[109,58311,58312],{"__ignoreMap":107},[112,58313,58314,58316,58318,58321],{"class":114,"line":115},[112,58315,58270],{"class":236},[112,58317,10309],{"class":229},[112,58319,58320],{"class":236}," string[]; ",[112,58322,58323],{"class":578},"// IDs for AtsDocument.get\n",[19,58325,58326],{},[478,58327,54500],{},[72,58329,58330,58338,58345],{},[46,58331,58332,54520,58334,56294,58336],{},[478,58333,54507],{},[109,58335,58270],{},[109,58337,58267],{},[46,58339,58340,54520,58342,58344],{},[478,58341,54519],{},[109,58343,58270],{}," array when creating activities",[46,58346,58347,58350],{},[478,58348,58349],{},"Multi-Document Support:"," Supports multiple documents per activity",[19,58352,58353],{},[478,58354,10603],{},[102,58356,58358],{"className":220,"code":58357,"language":222,"meta":107,"style":107},"// Before\nconst activity = {\n    title: 'Review Resume',\n    document_id: 'doc_123'\n}\n\n// After\nconst activity = {\n    title: 'Review Resume',\n    document_ids: ['doc_123', 'doc_456']\n}\n",[109,58359,58360,58364,58375,58385,58393,58397,58401,58405,58415,58423,58438],{"__ignoreMap":107},[112,58361,58362],{"class":114,"line":115},[112,58363,54540],{"class":578},[112,58365,58366,58368,58371,58373],{"class":114,"line":126},[112,58367,277],{"class":229},[112,58369,58370],{"class":129}," activity",[112,58372,354],{"class":229},[112,58374,280],{"class":236},[112,58376,58377,58380,58383],{"class":114,"line":135},[112,58378,58379],{"class":236},"    title: ",[112,58381,58382],{"class":122},"'Review Resume'",[112,58384,288],{"class":236},[112,58386,58387,58390],{"class":114,"line":147},[112,58388,58389],{"class":236},"    document_id: ",[112,58391,58392],{"class":122},"'doc_123'\n",[112,58394,58395],{"class":114,"line":202},[112,58396,584],{"class":236},[112,58398,58399],{"class":114,"line":208},[112,58400,272],{"emptyLinePlaceholder":271},[112,58402,58403],{"class":114,"line":291},[112,58404,54579],{"class":578},[112,58406,58407,58409,58411,58413],{"class":114,"line":299},[112,58408,277],{"class":229},[112,58410,58370],{"class":129},[112,58412,354],{"class":229},[112,58414,280],{"class":236},[112,58416,58417,58419,58421],{"class":114,"line":307},[112,58418,58379],{"class":236},[112,58420,58382],{"class":122},[112,58422,288],{"class":236},[112,58424,58425,58428,58431,58433,58436],{"class":114,"line":315},[112,58426,58427],{"class":236},"    document_ids: [",[112,58429,58430],{"class":122},"'doc_123'",[112,58432,1046],{"class":236},[112,58434,58435],{"class":122},"'doc_456'",[112,58437,2794],{"class":236},[112,58439,58440],{"class":114,"line":323},[112,58441,584],{"class":236},[16,58443],{},[35,58445,54378,58447,48940,58450],{"id":58446},"field-departments-groups",[109,58448,58449],{},"departments",[109,58451,55545],{},[19,58453,58454],{},[478,58455,55057],{},[72,58457,58458],{},[46,58459,58460,54868,58462],{},[109,58461,10681],{},[109,58463,54434],{},[19,58465,58466],{},[478,58467,54457],{},[102,58469,58471],{"className":220,"code":58470,"language":222,"meta":107,"style":107},"departments?: string[]; // @deprecated Use `groups` instead\n",[109,58472,58473],{"__ignoreMap":107},[112,58474,58475,58477,58479,58481],{"class":114,"line":115},[112,58476,58449],{"class":236},[112,58478,10309],{"class":229},[112,58480,58320],{"class":236},[112,58482,58483],{"class":578},"// @deprecated Use `groups` instead\n",[19,58485,58486],{},[478,58487,54479],{},[102,58489,58491],{"className":220,"code":58490,"language":222,"meta":107,"style":107},"groups?: IAtsGroup[]; // The departments/divisions/teams that this job belongs to\n",[109,58492,58493],{"__ignoreMap":107},[112,58494,58495,58497,58499,58502],{"class":114,"line":115},[112,58496,55545],{"class":236},[112,58498,10309],{"class":229},[112,58500,58501],{"class":236}," IAtsGroup[]; ",[112,58503,58504],{"class":578},"// The departments/divisions/teams that this job belongs to\n",[19,58506,58507],{},[478,58508,54500],{},[72,58510,58511,58519,58529],{},[46,58512,58513,54520,58515,56294,58517],{},[478,58514,54507],{},[109,58516,55545],{},[109,58518,58449],{},[46,58520,58521,54520,58523,55625,58525,58528],{},[478,58522,54519],{},[109,58524,55545],{},[109,58526,58527],{},"IAtsGroup"," objects instead of department strings",[46,58530,58531,58533],{},[478,58532,56028],{}," Provides group IDs, names, and types (TEAM, GROUP, DEPARTMENT, DIVISION, etc.)",[19,58535,58536],{},[478,58537,10603],{},[102,58539,58541],{"className":220,"code":58540,"language":222,"meta":107,"style":107},"// Before\nconst job = {\n    name: 'Software Engineer',\n    departments: ['Engineering', 'Product']\n}\n\n// After\nconst job = {\n    name: 'Software Engineer',\n    groups: [{\n        id: 'group_123',\n        name: 'Engineering',\n        type: 'DEPARTMENT'\n    }, {\n        id: 'group_456',\n        name: 'Product',\n        type: 'DEPARTMENT'\n    }]\n}\n",[109,58542,58543,58547,58558,58567,58580,58584,58588,58592,58602,58610,58614,58622,58630,58636,58641,58649,58657,58663,58667],{"__ignoreMap":107},[112,58544,58545],{"class":114,"line":115},[112,58546,54540],{"class":578},[112,58548,58549,58551,58554,58556],{"class":114,"line":126},[112,58550,277],{"class":229},[112,58552,58553],{"class":129}," job",[112,58555,354],{"class":229},[112,58557,280],{"class":236},[112,58559,58560,58562,58565],{"class":114,"line":135},[112,58561,18067],{"class":236},[112,58563,58564],{"class":122},"'Software Engineer'",[112,58566,288],{"class":236},[112,58568,58569,58572,58574,58576,58578],{"class":114,"line":147},[112,58570,58571],{"class":236},"    departments: [",[112,58573,55731],{"class":122},[112,58575,1046],{"class":236},[112,58577,55920],{"class":122},[112,58579,2794],{"class":236},[112,58581,58582],{"class":114,"line":202},[112,58583,584],{"class":236},[112,58585,58586],{"class":114,"line":208},[112,58587,272],{"emptyLinePlaceholder":271},[112,58589,58590],{"class":114,"line":291},[112,58591,54579],{"class":578},[112,58593,58594,58596,58598,58600],{"class":114,"line":299},[112,58595,277],{"class":229},[112,58597,58553],{"class":129},[112,58599,354],{"class":229},[112,58601,280],{"class":236},[112,58603,58604,58606,58608],{"class":114,"line":307},[112,58605,18067],{"class":236},[112,58607,58564],{"class":122},[112,58609,288],{"class":236},[112,58611,58612],{"class":114,"line":315},[112,58613,55713],{"class":236},[112,58615,58616,58618,58620],{"class":114,"line":323},[112,58617,55718],{"class":236},[112,58619,55721],{"class":122},[112,58621,288],{"class":236},[112,58623,58624,58626,58628],{"class":114,"line":329},[112,58625,55728],{"class":236},[112,58627,55731],{"class":122},[112,58629,288],{"class":236},[112,58631,58632,58634],{"class":114,"line":341},[112,58633,55738],{"class":236},[112,58635,55741],{"class":122},[112,58637,58638],{"class":114,"line":346},[112,58639,58640],{"class":236},"    }, {\n",[112,58642,58643,58645,58647],{"class":114,"line":366},[112,58644,55718],{"class":236},[112,58646,55911],{"class":122},[112,58648,288],{"class":236},[112,58650,58651,58653,58655],{"class":114,"line":381},[112,58652,55728],{"class":236},[112,58654,55920],{"class":122},[112,58656,288],{"class":236},[112,58658,58659,58661],{"class":114,"line":387},[112,58660,55738],{"class":236},[112,58662,55741],{"class":122},[112,58664,58665],{"class":114,"line":392},[112,58666,55746],{"class":236},[112,58668,58669],{"class":114,"line":409},[112,58670,584],{"class":236},[16,58672],{},[67,58674,54354],{"id":58675},"ticketing-fields",[35,58677,54378,58679,48940,58682],{"id":58678},"field-category-category_id",[109,58680,58681],{},"category",[109,58683,58684],{},"category_id",[19,58686,58687],{},[478,58688,55057],{},[72,58690,58691],{},[46,58692,58693,54868,58696],{},[109,58694,58695],{},"ITicketingTicket",[109,58697,58698],{},"src/models/UnifiedTicketing.ts",[19,58700,58701],{},[478,58702,54457],{},[102,58704,58706],{"className":220,"code":58705,"language":222,"meta":107,"style":107},"category?: string; // @deprecated; use category_id\n",[109,58707,58708],{"__ignoreMap":107},[112,58709,58710,58712,58714,58716],{"class":114,"line":115},[112,58711,58681],{"class":236},[112,58713,10309],{"class":229},[112,58715,54471],{"class":236},[112,58717,58718],{"class":578},"// @deprecated; use category_id\n",[19,58720,58721],{},[478,58722,54479],{},[102,58724,58726],{"className":220,"code":58725,"language":222,"meta":107,"style":107},"category_id?: string;\n",[109,58727,58728],{"__ignoreMap":107},[112,58729,58730,58732,58734],{"class":114,"line":115},[112,58731,58684],{"class":236},[112,58733,10309],{"class":229},[112,58735,54939],{"class":236},[19,58737,58738],{},[478,58739,54500],{},[72,58741,58742,58750,58757],{},[46,58743,58744,54520,58746,54523,58748,523],{},[478,58745,54507],{},[109,58747,58684],{},[109,58749,58681],{},[46,58751,58752,54520,58754,58756],{},[478,58753,54519],{},[109,58755,58684],{}," when creating or updating tickets",[46,58758,58759,58761,58762,58764],{},[478,58760,56760],{}," Using ",[109,58763,58684],{}," maintains consistency with other ID-based relationships",[19,58766,58767],{},[478,58768,10603],{},[102,58770,58772],{"className":220,"code":58771,"language":222,"meta":107,"style":107},"// Before\nconst ticket = {\n    subject: 'Support Request',\n    category: 'technical'\n}\n\n// After\nconst ticket = {\n    subject: 'Support Request',\n    category_id: 'category_123'\n}\n",[109,58773,58774,58778,58789,58799,58807,58811,58815,58819,58829,58837,58845],{"__ignoreMap":107},[112,58775,58776],{"class":114,"line":115},[112,58777,54540],{"class":578},[112,58779,58780,58782,58785,58787],{"class":114,"line":126},[112,58781,277],{"class":229},[112,58783,58784],{"class":129}," ticket",[112,58786,354],{"class":229},[112,58788,280],{"class":236},[112,58790,58791,58794,58797],{"class":114,"line":135},[112,58792,58793],{"class":236},"    subject: ",[112,58795,58796],{"class":122},"'Support Request'",[112,58798,288],{"class":236},[112,58800,58801,58804],{"class":114,"line":147},[112,58802,58803],{"class":236},"    category: ",[112,58805,58806],{"class":122},"'technical'\n",[112,58808,58809],{"class":114,"line":202},[112,58810,584],{"class":236},[112,58812,58813],{"class":114,"line":208},[112,58814,272],{"emptyLinePlaceholder":271},[112,58816,58817],{"class":114,"line":291},[112,58818,54579],{"class":578},[112,58820,58821,58823,58825,58827],{"class":114,"line":299},[112,58822,277],{"class":229},[112,58824,58784],{"class":129},[112,58826,354],{"class":229},[112,58828,280],{"class":236},[112,58830,58831,58833,58835],{"class":114,"line":307},[112,58832,58793],{"class":236},[112,58834,58796],{"class":122},[112,58836,288],{"class":236},[112,58838,58839,58842],{"class":114,"line":315},[112,58840,58841],{"class":236},"    category_id: ",[112,58843,58844],{"class":122},"'category_123'\n",[112,58846,58847],{"class":114,"line":323},[112,58848,584],{"class":236},[16,58850],{},[67,58852,54357],{"id":58853},"calendar-fields",[35,58855,55756,58857,48940,58860],{"id":58856},"fieldprimary-is_primary",[109,58858,58859],{},"primary",[109,58861,58862],{},"is_primary",[19,58864,58865],{},[478,58866,55057],{},[72,58868,58869],{},[46,58870,58871,54868,58874],{},[109,58872,58873],{},"ICalendarCalendar",[109,58875,58876],{},"src/models/UnifiedCalendar.ts",[19,58878,58879],{},[478,58880,54457],{},[102,58882,58884],{"className":220,"code":58883,"language":222,"meta":107,"style":107},"primary?: boolean; // @deprecated\n",[109,58885,58886],{"__ignoreMap":107},[112,58887,58888,58890,58892,58895],{"class":114,"line":115},[112,58889,58859],{"class":236},[112,58891,10309],{"class":229},[112,58893,58894],{"class":236}," boolean; ",[112,58896,55583],{"class":578},[19,58898,58899],{},[478,58900,54479],{},[102,58902,58904],{"className":220,"code":58903,"language":222,"meta":107,"style":107},"is_primary?: boolean;\n",[109,58905,58906],{"__ignoreMap":107},[112,58907,58908,58910,58912],{"class":114,"line":115},[112,58909,58862],{"class":236},[112,58911,10309],{"class":229},[112,58913,58914],{"class":236}," boolean;\n",[16,58916],{},[67,58918,54360],{"id":58919},"query-parameters-filters",[35,58921,58923,48940,58926],{"id":58922},"expand_recurring_events-expand",[109,58924,58925],{},"expand_recurring_events",[109,58927,58928],{},"expand",[19,58930,58931],{},[478,58932,54396],{},[72,58934,58935],{},[46,58936,58937],{},[109,58938,58939],{},"ICalendarEvent",[19,58941,58942],{},[478,58943,58944],{},"Deprecated Parameter:",[102,58946,58948],{"className":220,"code":58947,"language":222,"meta":107,"style":107},"expand_recurring_events?: boolean; // @deprecated; use expand\n",[109,58949,58950],{"__ignoreMap":107},[112,58951,58952,58954,58956,58958],{"class":114,"line":115},[112,58953,58925],{"class":236},[112,58955,10309],{"class":229},[112,58957,58894],{"class":236},[112,58959,58960],{"class":578},"// @deprecated; use expand\n",[19,58962,58963],{},[478,58964,54479],{},[102,58966,58968],{"className":220,"code":58967,"language":222,"meta":107,"style":107},"expand?: boolean;\n",[109,58969,58970],{"__ignoreMap":107},[112,58971,58972,58974,58976],{"class":114,"line":115},[112,58973,58928],{"class":236},[112,58975,10309],{"class":229},[112,58977,58914],{"class":236},[19,58979,58980],{},[478,58981,54500],{},[72,58983,58984,58995],{},[46,58985,58986,58989,58990,58992,58993],{},[478,58987,58988],{},"API Calls:"," Replace ",[109,58991,58925],{}," query parameter with ",[109,58994,58928],{},[46,58996,58997,2251,59000,59002],{},[478,58998,58999],{},"More Flexible:",[109,59001,58928],{}," supports expanding multiple event types, not just recurring events",[19,59004,59005],{},[478,59006,10603],{},[102,59008,59010],{"className":220,"code":59009,"language":222,"meta":107,"style":107},"// Before\nGET /api/calendar/events?expand_recurring_events=true\n\n// After\nGET /api/calendar/events?expand=true\n",[109,59011,59012,59016,59042,59046,59050],{"__ignoreMap":107},[112,59013,59014],{"class":114,"line":115},[112,59015,54540],{"class":578},[112,59017,59018,59020,59022,59024,59026,59029,59031,59034,59036,59038,59040],{"class":114,"line":126},[112,59019,2712],{"class":129},[112,59021,4705],{"class":229},[112,59023,23333],{"class":236},[112,59025,12874],{"class":229},[112,59027,59028],{"class":236},"calendar",[112,59030,12874],{"class":229},[112,59032,59033],{"class":236},"events",[112,59035,4711],{"class":229},[112,59037,58925],{"class":236},[112,59039,335],{"class":229},[112,59041,4144],{"class":129},[112,59043,59044],{"class":114,"line":135},[112,59045,272],{"emptyLinePlaceholder":271},[112,59047,59048],{"class":114,"line":147},[112,59049,54579],{"class":578},[112,59051,59052,59054,59056,59058,59060,59062,59064,59066,59068,59070,59072],{"class":114,"line":202},[112,59053,2712],{"class":129},[112,59055,4705],{"class":229},[112,59057,23333],{"class":236},[112,59059,12874],{"class":229},[112,59061,59028],{"class":236},[112,59063,12874],{"class":229},[112,59065,59033],{"class":236},[112,59067,4711],{"class":229},[112,59069,58928],{"class":236},[112,59071,335],{"class":229},[112,59073,4144],{"class":129},[16,59075],{},[35,59077,59079,48940,59082],{"id":59078},"end_le-end_lt",[109,59080,59081],{},"end_le",[109,59083,59084],{},"end_lt",[19,59086,59087],{},[478,59088,54396],{},[72,59090,59091,59095,59100,59105,59110,59115,59120,59125,59130,59135,59139,59144,59148,59153,59158],{},[46,59092,59093],{},[109,59094,58939],{},[46,59096,59097],{},[109,59098,59099],{},"ICalendarBusy",[46,59101,59102],{},[109,59103,59104],{},"ICalendarRecording",[46,59106,59107],{},[109,59108,59109],{},"IUcCall",[46,59111,59112],{},[109,59113,59114],{},"IUcRecording",[46,59116,59117],{},[109,59118,59119],{},"IHrisTimeoff",[46,59121,59122],{},[109,59123,59124],{},"IHrisTimeshift",[46,59126,59127],{},[109,59128,59129],{},"IAccountingBalancesheet",[46,59131,59132],{},[109,59133,59134],{},"IAccountingCashflow",[46,59136,59137],{},[109,59138,57153],{},[46,59140,59141],{},[109,59142,59143],{},"IAccountingTrialbalance",[46,59145,59146],{},[109,59147,55388],{},[46,59149,59150],{},[109,59151,59152],{},"IPaymentSubscription",[46,59154,59155],{},[109,59156,59157],{},"IPaymentPayment",[46,59159,59160],{},[109,59161,59162],{},"IPaymentPayout",[19,59164,59165],{},[478,59166,58944],{},[102,59168,59170],{"className":220,"code":59169,"language":222,"meta":107,"style":107},"end_le?: string | Date; // @deprecated; use end_lt\n",[109,59171,59172],{"__ignoreMap":107},[112,59173,59174,59176,59178,59181,59183,59186],{"class":114,"line":115},[112,59175,59081],{"class":236},[112,59177,10309],{"class":229},[112,59179,59180],{"class":236}," string ",[112,59182,56696],{"class":229},[112,59184,59185],{"class":236}," Date; ",[112,59187,59188],{"class":578},"// @deprecated; use end_lt\n",[19,59190,59191],{},[478,59192,54479],{},[102,59194,59196],{"className":220,"code":59195,"language":222,"meta":107,"style":107},"end_lt?: string | Date;\n",[109,59197,59198],{"__ignoreMap":107},[112,59199,59200,59202,59204,59206,59208],{"class":114,"line":115},[112,59201,59084],{"class":236},[112,59203,10309],{"class":229},[112,59205,59180],{"class":236},[112,59207,56696],{"class":229},[112,59209,59210],{"class":236}," Date;\n",[19,59212,59213],{},[478,59214,54500],{},[72,59216,59217,59227],{},[46,59218,59219,58989,59221,59223,59224,59226],{},[478,59220,58988],{},[109,59222,59081],{}," (less than or equal) with ",[109,59225,59084],{}," (less than)",[46,59228,59229,59231],{},[478,59230,56760],{}," Aligns with standard date range filtering conventions",[19,59233,59234],{},[478,59235,10603],{},[102,59237,59239],{"className":220,"code":59238,"language":222,"meta":107,"style":107},"// Before\nGET /api/calendar/events?end_le=2024-12-31\n\n// After\nGET /api/calendar/events?end_lt=2025-01-01\n// Note: Adjust date by +1 day if you need inclusive end date\n",[109,59240,59241,59245,59280,59284,59288,59323],{"__ignoreMap":107},[112,59242,59243],{"class":114,"line":115},[112,59244,54540],{"class":578},[112,59246,59247,59249,59251,59253,59255,59257,59259,59261,59263,59265,59267,59270,59272,59275,59277],{"class":114,"line":126},[112,59248,2712],{"class":129},[112,59250,4705],{"class":229},[112,59252,23333],{"class":236},[112,59254,12874],{"class":229},[112,59256,59028],{"class":236},[112,59258,12874],{"class":229},[112,59260,59033],{"class":236},[112,59262,4711],{"class":229},[112,59264,59081],{"class":236},[112,59266,335],{"class":229},[112,59268,59269],{"class":129},"2024",[112,59271,23301],{"class":229},[112,59273,59274],{"class":129},"12",[112,59276,23301],{"class":229},[112,59278,59279],{"class":129},"31\n",[112,59281,59282],{"class":114,"line":135},[112,59283,272],{"emptyLinePlaceholder":271},[112,59285,59286],{"class":114,"line":147},[112,59287,54579],{"class":578},[112,59289,59290,59292,59294,59296,59298,59300,59302,59304,59306,59308,59310,59313,59315,59318,59320],{"class":114,"line":202},[112,59291,2712],{"class":129},[112,59293,4705],{"class":229},[112,59295,23333],{"class":236},[112,59297,12874],{"class":229},[112,59299,59028],{"class":236},[112,59301,12874],{"class":229},[112,59303,59033],{"class":236},[112,59305,4711],{"class":229},[112,59307,59084],{"class":236},[112,59309,335],{"class":229},[112,59311,59312],{"class":129},"2025",[112,59314,23301],{"class":229},[112,59316,59317],{"class":129},"01",[112,59319,23301],{"class":229},[112,59321,59322],{"class":129},"01\n",[112,59324,59325],{"class":114,"line":208},[112,59326,59327],{"class":578},"// Note: Adjust date by +1 day if you need inclusive end date\n",[102,59329,59332],{"className":59330,"code":59331,"language":177},[44346],"\n\n---\n\n\n## Webhook Payload Fields\n\n\n### Field: `sig` → `sig256`\n\n\n**Affected Interface:**\n\n- `IWebhookData`\n\n**Deprecated Field:**\n\n\n```typescript\nsig?: string; // @deprecated; use sig256 instead\n",[109,59333,59331],{"__ignoreMap":107},[19,59335,59336],{},[478,59337,54479],{},[102,59339,59341],{"className":220,"code":59340,"language":222,"meta":107,"style":107},"sig256?: string; // HMAC-SHA256(workspace.secret, data + nonce)\n",[109,59342,59343],{"__ignoreMap":107},[112,59344,59345,59347,59349,59351],{"class":114,"line":115},[112,59346,47602],{"class":236},[112,59348,10309],{"class":229},[112,59350,54471],{"class":236},[112,59352,59353],{"class":578},"// HMAC-SHA256(workspace.secret, data + nonce)\n",[19,59355,59356],{},[478,59357,54500],{},[72,59359,59360,59370,59381],{},[46,59361,59362,54520,59365,54523,59367,59369],{},[478,59363,59364],{},"Webhook Verification:",[109,59366,47602],{},[109,59368,18798],{}," for webhook signature verification",[46,59371,59372,2251,59375,59377,59378,59380],{},[478,59373,59374],{},"Security:",[109,59376,47602],{}," uses HMAC-SHA256 which is more secure than the previous signature algorithm. ",[109,59379,18798],{}," used HMAC-SHA1, which is now deprecated.",[46,59382,59383,59386,59387,15473],{},[478,59384,59385],{},"Verification:"," Update your webhook verification code to check ",[109,59388,47602],{},[19,59390,59391],{},[478,59392,10603],{},[102,59394,59396],{"className":220,"code":59395,"language":222,"meta":107,"style":107},"// Before\nconst isValid = verifySignature(webhook.sig, payload, secret, 'sha');\n\n// After\nconst isValid = verifySignature(webhook.sig256, payload, secret, ‘sha256');\n",[109,59397,59398,59402,59422,59426,59430],{"__ignoreMap":107},[112,59399,59400],{"class":114,"line":115},[112,59401,54540],{"class":578},[112,59403,59404,59406,59409,59411,59414,59417,59420],{"class":114,"line":126},[112,59405,277],{"class":229},[112,59407,59408],{"class":129}," isValid",[112,59410,354],{"class":229},[112,59412,59413],{"class":118}," verifySignature",[112,59415,59416],{"class":236},"(webhook.sig, payload, secret, ",[112,59418,59419],{"class":122},"'sha'",[112,59421,464],{"class":236},[112,59423,59424],{"class":114,"line":135},[112,59425,272],{"emptyLinePlaceholder":271},[112,59427,59428],{"class":114,"line":147},[112,59429,54579],{"class":578},[112,59431,59432,59434,59436,59438,59440,59443,59446],{"class":114,"line":202},[112,59433,277],{"class":229},[112,59435,59408],{"class":129},[112,59437,354],{"class":229},[112,59439,59413],{"class":118},[112,59441,59442],{"class":236},"(webhook.sig256, payload, secret, ‘sha256",[112,59444,59445],{"class":122},"')",[112,59447,237],{"class":2885},[102,59449,59452],{"className":59450,"code":59451,"language":177},[44346],"\n\n---\n\n\n## Deprecated Objects/Usage Patterns\n\n\n### `IAccountingInvoice` with `type === 'BILL'` → Use `IAccountingBill`\n\n\n**Status:** Deprecated usage pattern:\n\n- Instead of using `IAccountingInvoice` with `type='BILL'`, use the dedicated `IAccountingBill` object\n\n**Affected Model:**\n\n- `IAccountingInvoice` - `src/models/UnifiedAccounting.ts`\n\n**Deprecated Pattern:**\n\n\n```typescript\ninterface IAccountingInvoice {\n  type: 'BILL',  // @deprecated - use IAccountingBill instead\n  ...\n}\n",[109,59453,59451],{"__ignoreMap":107},[19,59455,59456],{},[478,59457,54479],{},[102,59459,59461],{"className":220,"code":59460,"language":222,"meta":107,"style":107},"interface IAccountingBill {\n    ...\n}\n",[109,59462,59463,59472,59477],{"__ignoreMap":107},[112,59464,59465,59467,59470],{"class":114,"line":115},[112,59466,10296],{"class":229},[112,59468,59469],{"class":118}," IAccountingBill",[112,59471,280],{"class":236},[112,59473,59474],{"class":114,"line":126},[112,59475,59476],{"class":229},"    ...\n",[112,59478,59479],{"class":114,"line":135},[112,59480,584],{"class":236},[19,59482,59483],{},[478,59484,59485],{},"Key Differences:",[72,59487,59488,59500,59507,59517],{},[46,59489,59490,59493,59494,54523,59497],{},[109,59491,59492],{},"IAccountingBill"," uses ",[109,59495,59496],{},"bill_number",[109,59498,59499],{},"invoice_number",[46,59501,59502,59504,59505,15473],{},[109,59503,59492],{}," does not have the deprecated ",[109,59506,2472],{},[46,59508,59509,59504,59511,59513,59514,59516],{},[109,59510,59492],{},[109,59512,56661],{}," field (uses ",[109,59515,56664],{}," instead)",[46,59518,59519],{},"More semantic clarity: a Bill is clearly distinct from an Invoice",[19,59521,59522],{},[478,59523,54500],{},[72,59525,59526,59541],{},[46,59527,59528,54520,59530,59533,59534,59537,59538],{},[478,59529,54507],{},[109,59531,59532],{},"accounting_bill"," endpoints instead of ",[109,59535,59536],{},"accounting_invoice"," endpoints with ",[109,59539,59540],{},"type='BILL'",[46,59542,59543,54520,59545,59547,59548,44619,59550],{},[478,59544,54519],{},[109,59546,59532],{}," create/update endpoints instead of ",[109,59549,59536],{},[109,59551,59540],{},[19,59553,59554,59557],{},[478,59555,59556],{},"Field Mapping:"," When migrating data:",[72,59559,59560,59566,59572],{},[46,59561,59562,48940,59564],{},[109,59563,59499],{},[109,59565,59496],{},[46,59567,59568,59569,59571],{},"Remove ",[109,59570,2472],{}," field (no longer needed)",[46,59573,59574,48940,59576,59578],{},[109,59575,56661],{},[109,59577,56664],{}," (if still using deprecated field)",[19,59580,59581],{},[478,59582,59583],{},"API Endpoints:",[72,59585,59586,59595],{},[46,59587,59588,59589,44619,59592],{},"❌ Deprecated: ",[109,59590,59591],{},"POST /accounting/invoice",[109,59593,59594],{},"type: 'BILL'",[46,59596,59597,59598],{},"✅ Use: ",[109,59599,59600],{},"POST /accounting/bill",[19,59602,59603],{},[478,59604,10603],{},[102,59606,59608],{"className":220,"code":59607,"language":222,"meta":107,"style":107},"// Before\nPOST /accounting/invoice\n{\n    'type': 'BILL',\n    'invoice_number': 'BILL-001',\n    'contact_id': 'contact_123',\n    'total_amount': 1000\n}\n\n// After\nPOST /accounting/bill\n{\n    'bill_number': 'BILL-001',\n    'contact_id': 'contact_123',\n    'total_amount': 1000\n}\n",[109,59609,59610,59614,59628,59632,59644,59656,59667,59677,59681,59685,59689,59702,59706,59717,59727,59735],{"__ignoreMap":107},[112,59611,59612],{"class":114,"line":115},[112,59613,54540],{"class":578},[112,59615,59616,59618,59620,59623,59625],{"class":114,"line":126},[112,59617,31511],{"class":129},[112,59619,4705],{"class":229},[112,59621,59622],{"class":236},"accounting",[112,59624,12874],{"class":229},[112,59626,59627],{"class":236},"invoice\n",[112,59629,59630],{"class":114,"line":135},[112,59631,2327],{"class":236},[112,59633,59634,59637,59639,59642],{"class":114,"line":147},[112,59635,59636],{"class":122},"    'type'",[112,59638,2335],{"class":236},[112,59640,59641],{"class":122},"'BILL'",[112,59643,288],{"class":236},[112,59645,59646,59649,59651,59654],{"class":114,"line":202},[112,59647,59648],{"class":122},"    'invoice_number'",[112,59650,2335],{"class":236},[112,59652,59653],{"class":122},"'BILL-001'",[112,59655,288],{"class":236},[112,59657,59658,59661,59663,59665],{"class":114,"line":208},[112,59659,59660],{"class":122},"    'contact_id'",[112,59662,2335],{"class":236},[112,59664,57094],{"class":122},[112,59666,288],{"class":236},[112,59668,59669,59672,59674],{"class":114,"line":291},[112,59670,59671],{"class":122},"    'total_amount'",[112,59673,2335],{"class":236},[112,59675,59676],{"class":129},"1000\n",[112,59678,59679],{"class":114,"line":299},[112,59680,584],{"class":236},[112,59682,59683],{"class":114,"line":307},[112,59684,272],{"emptyLinePlaceholder":271},[112,59686,59687],{"class":114,"line":315},[112,59688,54579],{"class":578},[112,59690,59691,59693,59695,59697,59699],{"class":114,"line":323},[112,59692,31511],{"class":129},[112,59694,4705],{"class":229},[112,59696,59622],{"class":236},[112,59698,12874],{"class":229},[112,59700,59701],{"class":236},"bill\n",[112,59703,59704],{"class":114,"line":329},[112,59705,2327],{"class":236},[112,59707,59708,59711,59713,59715],{"class":114,"line":341},[112,59709,59710],{"class":122},"    'bill_number'",[112,59712,2335],{"class":236},[112,59714,59653],{"class":122},[112,59716,288],{"class":236},[112,59718,59719,59721,59723,59725],{"class":114,"line":346},[112,59720,59660],{"class":122},[112,59722,2335],{"class":236},[112,59724,57094],{"class":122},[112,59726,288],{"class":236},[112,59728,59729,59731,59733],{"class":114,"line":366},[112,59730,59671],{"class":122},[112,59732,2335],{"class":236},[112,59734,59676],{"class":129},[112,59736,59737],{"class":114,"line":381},[112,59738,584],{"class":236},[16,59740],{},[35,59742,59744,59747],{"id":59743},"iaccountingreport-use-individual-report-objects",[109,59745,59746],{},"IAccountingReport"," → Use Individual Report Objects",[19,59749,59750,59753],{},[478,59751,59752],{},"Status:"," Deprecated object",[72,59755,59756],{},[46,59757,59758,59759,59761],{},"Instead of using ",[109,59760,59746],{},", use the individual report objects directly",[19,59763,59764],{},[478,59765,55057],{},[72,59767,59768],{},[46,59769,59770,54868,59772],{},[109,59771,59746],{},[109,59773,56937],{},[19,59775,59776],{},[478,59777,59778],{},"Deprecated Object Structure:",[102,59780,59782],{"className":220,"code":59781,"language":222,"meta":107,"style":107},"interface IAccountingReport {\n  type?: TAccountingReportType; // Enum: TRIAL_BALANCE, BALANCE_SHEET, PROFIT_AND_LOSS  \n  ...\n}\n",[109,59783,59784,59793,59808,59812],{"__ignoreMap":107},[112,59785,59786,59788,59791],{"class":114,"line":115},[112,59787,10296],{"class":229},[112,59789,59790],{"class":118}," IAccountingReport",[112,59792,280],{"class":236},[112,59794,59795,59798,59800,59803,59805],{"class":114,"line":126},[112,59796,59797],{"class":517},"  type",[112,59799,10309],{"class":229},[112,59801,59802],{"class":118}," TAccountingReportType",[112,59804,10369],{"class":236},[112,59806,59807],{"class":578},"// Enum: TRIAL_BALANCE, BALANCE_SHEET, PROFIT_AND_LOSS  \n",[112,59809,59810],{"class":114,"line":135},[112,59811,10781],{"class":229},[112,59813,59814],{"class":114,"line":147},[112,59815,584],{"class":236},[19,59817,59818,59820],{},[478,59819,54479],{}," Use individual report objects directly",[19,59822,59823],{},[478,59824,59825],{},"Balance Sheet:",[102,59827,59829],{"className":220,"code":59828,"language":222,"meta":107,"style":107},"interface IAccountingBalancesheet {\n  id?: string;  \n  created_at?: (string | Date | number);  \n  updated_at?: (string | Date | number);  \n  start_at?: (string | Date | number);  \n  end_at?: (string | Date | number);  \n  name?: string;  \n  currency?: string;  \n  net_assets_amount?: number;  \n  assets?: IAccountingBalancesheetItem[];  \n  liabilities?: IAccountingBalancesheetItem[];  \n  equity?: IAccountingBalancesheetItem[];  \n  raw?: unknown;\n}\n",[109,59830,59831,59840,59851,59872,59892,59913,59934,59944,59955,59966,59979,59990,60001,60012],{"__ignoreMap":107},[112,59832,59833,59835,59838],{"class":114,"line":115},[112,59834,10296],{"class":229},[112,59836,59837],{"class":118}," IAccountingBalancesheet",[112,59839,280],{"class":236},[112,59841,59842,59844,59846,59848],{"class":114,"line":126},[112,59843,10306],{"class":517},[112,59845,10309],{"class":229},[112,59847,523],{"class":129},[112,59849,59850],{"class":236},";  \n",[112,59852,59853,59855,59857,59859,59861,59863,59865,59867,59869],{"class":114,"line":135},[112,59854,10318],{"class":517},[112,59856,10309],{"class":229},[112,59858,1419],{"class":236},[112,59860,2445],{"class":129},[112,59862,10327],{"class":229},[112,59864,10330],{"class":118},[112,59866,10327],{"class":229},[112,59868,1054],{"class":129},[112,59870,59871],{"class":236},");  \n",[112,59873,59874,59876,59878,59880,59882,59884,59886,59888,59890],{"class":114,"line":147},[112,59875,10341],{"class":517},[112,59877,10309],{"class":229},[112,59879,1419],{"class":236},[112,59881,2445],{"class":129},[112,59883,10327],{"class":229},[112,59885,10330],{"class":118},[112,59887,10327],{"class":229},[112,59889,1054],{"class":129},[112,59891,59871],{"class":236},[112,59893,59894,59897,59899,59901,59903,59905,59907,59909,59911],{"class":114,"line":202},[112,59895,59896],{"class":517},"  start_at",[112,59898,10309],{"class":229},[112,59900,1419],{"class":236},[112,59902,2445],{"class":129},[112,59904,10327],{"class":229},[112,59906,10330],{"class":118},[112,59908,10327],{"class":229},[112,59910,1054],{"class":129},[112,59912,59871],{"class":236},[112,59914,59915,59918,59920,59922,59924,59926,59928,59930,59932],{"class":114,"line":208},[112,59916,59917],{"class":517},"  end_at",[112,59919,10309],{"class":229},[112,59921,1419],{"class":236},[112,59923,2445],{"class":129},[112,59925,10327],{"class":229},[112,59927,10330],{"class":118},[112,59929,10327],{"class":229},[112,59931,1054],{"class":129},[112,59933,59871],{"class":236},[112,59935,59936,59938,59940,59942],{"class":114,"line":291},[112,59937,10362],{"class":517},[112,59939,10309],{"class":229},[112,59941,523],{"class":129},[112,59943,59850],{"class":236},[112,59945,59946,59949,59951,59953],{"class":114,"line":299},[112,59947,59948],{"class":517},"  currency",[112,59950,10309],{"class":229},[112,59952,523],{"class":129},[112,59954,59850],{"class":236},[112,59956,59957,59960,59962,59964],{"class":114,"line":307},[112,59958,59959],{"class":517},"  net_assets_amount",[112,59961,10309],{"class":229},[112,59963,1054],{"class":129},[112,59965,59850],{"class":236},[112,59967,59968,59971,59973,59976],{"class":114,"line":315},[112,59969,59970],{"class":517},"  assets",[112,59972,10309],{"class":229},[112,59974,59975],{"class":118}," IAccountingBalancesheetItem",[112,59977,59978],{"class":236},"[];  \n",[112,59980,59981,59984,59986,59988],{"class":114,"line":323},[112,59982,59983],{"class":517},"  liabilities",[112,59985,10309],{"class":229},[112,59987,59975],{"class":118},[112,59989,59978],{"class":236},[112,59991,59992,59995,59997,59999],{"class":114,"line":329},[112,59993,59994],{"class":517},"  equity",[112,59996,10309],{"class":229},[112,59998,59975],{"class":118},[112,60000,59978],{"class":236},[112,60002,60003,60006,60008,60010],{"class":114,"line":341},[112,60004,60005],{"class":517},"  raw",[112,60007,10309],{"class":229},[112,60009,10725],{"class":129},[112,60011,237],{"class":236},[112,60013,60014],{"class":114,"line":346},[112,60015,584],{"class":236},[19,60017,60018],{},[478,60019,60020],{},"Profit and Loss:",[102,60022,60024],{"className":220,"code":60023,"language":222,"meta":107,"style":107},"interface IAccountingProfitloss {\n  id?: string;  \n  created_at?: (string | Date | number);  \n  updated_at?: (string | Date | number);  \n  category_ids?: string[];  \n  start_at?: (string | Date | number);  \n  end_at?: (string | Date | number);  \n  name?: string;  \n  currency?: string;  \n  income_sections?: IAccountingProfitlossSection[];  \n  expenses_sections?: IAccountingProfitlossSection[];  \n  cost_of_goods_sold_sections?: IAccountingProfitlossSection[];  \n  income_total_amount?: number;  \n  net_income_amount?: number;  \n  expenses_total_amount?: number;  \n  cost_of_goods_sold_total_amount?: number;  \n  raw?: unknown;\n}\n",[109,60025,60026,60035,60045,60065,60085,60096,60116,60136,60146,60156,60167,60178,60189,60200,60211,60222,60233,60243],{"__ignoreMap":107},[112,60027,60028,60030,60033],{"class":114,"line":115},[112,60029,10296],{"class":229},[112,60031,60032],{"class":118}," IAccountingProfitloss",[112,60034,280],{"class":236},[112,60036,60037,60039,60041,60043],{"class":114,"line":126},[112,60038,10306],{"class":517},[112,60040,10309],{"class":229},[112,60042,523],{"class":129},[112,60044,59850],{"class":236},[112,60046,60047,60049,60051,60053,60055,60057,60059,60061,60063],{"class":114,"line":135},[112,60048,10318],{"class":517},[112,60050,10309],{"class":229},[112,60052,1419],{"class":236},[112,60054,2445],{"class":129},[112,60056,10327],{"class":229},[112,60058,10330],{"class":118},[112,60060,10327],{"class":229},[112,60062,1054],{"class":129},[112,60064,59871],{"class":236},[112,60066,60067,60069,60071,60073,60075,60077,60079,60081,60083],{"class":114,"line":147},[112,60068,10341],{"class":517},[112,60070,10309],{"class":229},[112,60072,1419],{"class":236},[112,60074,2445],{"class":129},[112,60076,10327],{"class":229},[112,60078,10330],{"class":118},[112,60080,10327],{"class":229},[112,60082,1054],{"class":129},[112,60084,59871],{"class":236},[112,60086,60087,60090,60092,60094],{"class":114,"line":202},[112,60088,60089],{"class":517},"  category_ids",[112,60091,10309],{"class":229},[112,60093,523],{"class":129},[112,60095,59978],{"class":236},[112,60097,60098,60100,60102,60104,60106,60108,60110,60112,60114],{"class":114,"line":208},[112,60099,59896],{"class":517},[112,60101,10309],{"class":229},[112,60103,1419],{"class":236},[112,60105,2445],{"class":129},[112,60107,10327],{"class":229},[112,60109,10330],{"class":118},[112,60111,10327],{"class":229},[112,60113,1054],{"class":129},[112,60115,59871],{"class":236},[112,60117,60118,60120,60122,60124,60126,60128,60130,60132,60134],{"class":114,"line":291},[112,60119,59917],{"class":517},[112,60121,10309],{"class":229},[112,60123,1419],{"class":236},[112,60125,2445],{"class":129},[112,60127,10327],{"class":229},[112,60129,10330],{"class":118},[112,60131,10327],{"class":229},[112,60133,1054],{"class":129},[112,60135,59871],{"class":236},[112,60137,60138,60140,60142,60144],{"class":114,"line":299},[112,60139,10362],{"class":517},[112,60141,10309],{"class":229},[112,60143,523],{"class":129},[112,60145,59850],{"class":236},[112,60147,60148,60150,60152,60154],{"class":114,"line":307},[112,60149,59948],{"class":517},[112,60151,10309],{"class":229},[112,60153,523],{"class":129},[112,60155,59850],{"class":236},[112,60157,60158,60161,60163,60165],{"class":114,"line":315},[112,60159,60160],{"class":517},"  income_sections",[112,60162,10309],{"class":229},[112,60164,58250],{"class":118},[112,60166,59978],{"class":236},[112,60168,60169,60172,60174,60176],{"class":114,"line":323},[112,60170,60171],{"class":517},"  expenses_sections",[112,60173,10309],{"class":229},[112,60175,58250],{"class":118},[112,60177,59978],{"class":236},[112,60179,60180,60183,60185,60187],{"class":114,"line":329},[112,60181,60182],{"class":517},"  cost_of_goods_sold_sections",[112,60184,10309],{"class":229},[112,60186,58250],{"class":118},[112,60188,59978],{"class":236},[112,60190,60191,60194,60196,60198],{"class":114,"line":341},[112,60192,60193],{"class":517},"  income_total_amount",[112,60195,10309],{"class":229},[112,60197,1054],{"class":129},[112,60199,59850],{"class":236},[112,60201,60202,60205,60207,60209],{"class":114,"line":346},[112,60203,60204],{"class":517},"  net_income_amount",[112,60206,10309],{"class":229},[112,60208,1054],{"class":129},[112,60210,59850],{"class":236},[112,60212,60213,60216,60218,60220],{"class":114,"line":366},[112,60214,60215],{"class":517},"  expenses_total_amount",[112,60217,10309],{"class":229},[112,60219,1054],{"class":129},[112,60221,59850],{"class":236},[112,60223,60224,60227,60229,60231],{"class":114,"line":381},[112,60225,60226],{"class":517},"  cost_of_goods_sold_total_amount",[112,60228,10309],{"class":229},[112,60230,1054],{"class":129},[112,60232,59850],{"class":236},[112,60234,60235,60237,60239,60241],{"class":114,"line":387},[112,60236,60005],{"class":517},[112,60238,10309],{"class":229},[112,60240,10725],{"class":129},[112,60242,237],{"class":236},[112,60244,60245],{"class":114,"line":392},[112,60246,584],{"class":236},[19,60248,60249],{},[478,60250,60251],{},"Trial Balance:",[102,60253,60255],{"className":220,"code":60254,"language":222,"meta":107,"style":107},"interface IAccountingTrialbalance {\n  id?: string;  \n  created_at?: (string | Date | number);  \n  updated_at?: (string | Date | number);  \n  start_at?: (string | Date | number);  \n  name?: string;  \n  currency?: string;  \n  end_at?: (string | Date | number);  \n  total_debit_amount?: number;  \n  total_credit_amount?: number;  \n  sub_items?: IAccountingTrialbalanceSubItem[];  \n  raw?: unknown;\n}\n",[109,60256,60257,60266,60276,60296,60316,60336,60346,60356,60376,60387,60398,60410,60420],{"__ignoreMap":107},[112,60258,60259,60261,60264],{"class":114,"line":115},[112,60260,10296],{"class":229},[112,60262,60263],{"class":118}," IAccountingTrialbalance",[112,60265,280],{"class":236},[112,60267,60268,60270,60272,60274],{"class":114,"line":126},[112,60269,10306],{"class":517},[112,60271,10309],{"class":229},[112,60273,523],{"class":129},[112,60275,59850],{"class":236},[112,60277,60278,60280,60282,60284,60286,60288,60290,60292,60294],{"class":114,"line":135},[112,60279,10318],{"class":517},[112,60281,10309],{"class":229},[112,60283,1419],{"class":236},[112,60285,2445],{"class":129},[112,60287,10327],{"class":229},[112,60289,10330],{"class":118},[112,60291,10327],{"class":229},[112,60293,1054],{"class":129},[112,60295,59871],{"class":236},[112,60297,60298,60300,60302,60304,60306,60308,60310,60312,60314],{"class":114,"line":147},[112,60299,10341],{"class":517},[112,60301,10309],{"class":229},[112,60303,1419],{"class":236},[112,60305,2445],{"class":129},[112,60307,10327],{"class":229},[112,60309,10330],{"class":118},[112,60311,10327],{"class":229},[112,60313,1054],{"class":129},[112,60315,59871],{"class":236},[112,60317,60318,60320,60322,60324,60326,60328,60330,60332,60334],{"class":114,"line":202},[112,60319,59896],{"class":517},[112,60321,10309],{"class":229},[112,60323,1419],{"class":236},[112,60325,2445],{"class":129},[112,60327,10327],{"class":229},[112,60329,10330],{"class":118},[112,60331,10327],{"class":229},[112,60333,1054],{"class":129},[112,60335,59871],{"class":236},[112,60337,60338,60340,60342,60344],{"class":114,"line":208},[112,60339,10362],{"class":517},[112,60341,10309],{"class":229},[112,60343,523],{"class":129},[112,60345,59850],{"class":236},[112,60347,60348,60350,60352,60354],{"class":114,"line":291},[112,60349,59948],{"class":517},[112,60351,10309],{"class":229},[112,60353,523],{"class":129},[112,60355,59850],{"class":236},[112,60357,60358,60360,60362,60364,60366,60368,60370,60372,60374],{"class":114,"line":299},[112,60359,59917],{"class":517},[112,60361,10309],{"class":229},[112,60363,1419],{"class":236},[112,60365,2445],{"class":129},[112,60367,10327],{"class":229},[112,60369,10330],{"class":118},[112,60371,10327],{"class":229},[112,60373,1054],{"class":129},[112,60375,59871],{"class":236},[112,60377,60378,60381,60383,60385],{"class":114,"line":307},[112,60379,60380],{"class":517},"  total_debit_amount",[112,60382,10309],{"class":229},[112,60384,1054],{"class":129},[112,60386,59850],{"class":236},[112,60388,60389,60392,60394,60396],{"class":114,"line":315},[112,60390,60391],{"class":517},"  total_credit_amount",[112,60393,10309],{"class":229},[112,60395,1054],{"class":129},[112,60397,59850],{"class":236},[112,60399,60400,60403,60405,60408],{"class":114,"line":323},[112,60401,60402],{"class":517},"  sub_items",[112,60404,10309],{"class":229},[112,60406,60407],{"class":118}," IAccountingTrialbalanceSubItem",[112,60409,59978],{"class":236},[112,60411,60412,60414,60416,60418],{"class":114,"line":329},[112,60413,60005],{"class":517},[112,60415,10309],{"class":229},[112,60417,10725],{"class":129},[112,60419,237],{"class":236},[112,60421,60422],{"class":114,"line":341},[112,60423,584],{"class":236},[19,60425,60426],{},[478,60427,60428],{},"Cash Flow:",[102,60430,60432],{"className":220,"code":60431,"language":222,"meta":107,"style":107},"interface IAccountingCashflow {\n  id?: string;  \n  created_at?: (string | Date | number);  \n  updated_at?: (string | Date | number);  \n  start_at?: (string | Date | number);  \n  end_at?: (string | Date | number);  \n  category_ids?: string[];  \n  contact_id?: string;  name?: string; // e.g. \"Cash Flow Statement Q1 2020\"  \n  currency?: string; // ISO 4217, e.g. \"USD\"  \n  cash_beginning_amount?: number; // Cash at beginning of period  \n  cash_ending_amount?: number; // Cash at end of period  \n  net_change_in_cash_amount?: number; // Usually ending - beginning  \n  operating_sections?: IAccountingCashflowSection[];  \n  investing_sections?: IAccountingCashflowSection[];  \n  financing_sections?: IAccountingCashflowSection[];  raw?: unknown;\n}\n\ninterface IAccountingCashflowSection {\n  section_name?: string; // e.g. \"Operating Activities\"  \n  total_amount?: number; // Net cash provided/used by this section  \n  items?: IAccountingCashflowItem[];\n}\n\ninterface IAccountingCashflowItem {\n  account_id?: string; // If attributable to a specific GL account  \n  name?: string; // e.g. \"Net Income\", \"Depreciation\", \"Equipment\"  \n  amount?: number; // Positive = inflow, Negative = outflow  \n  transaction_ids?: string[]; // Optional linkage to transactions  \n  sub_items?: IAccountingCashflowItem[];\n}\n",[109,60433,60434,60443,60453,60473,60493,60513,60533,60543,60566,60579,60593,60607,60621,60633,60644,60664,60668,60672,60680,60694,60708,60720,60724,60728,60736,60750,60763,60777,60791,60801],{"__ignoreMap":107},[112,60435,60436,60438,60441],{"class":114,"line":115},[112,60437,10296],{"class":229},[112,60439,60440],{"class":118}," IAccountingCashflow",[112,60442,280],{"class":236},[112,60444,60445,60447,60449,60451],{"class":114,"line":126},[112,60446,10306],{"class":517},[112,60448,10309],{"class":229},[112,60450,523],{"class":129},[112,60452,59850],{"class":236},[112,60454,60455,60457,60459,60461,60463,60465,60467,60469,60471],{"class":114,"line":135},[112,60456,10318],{"class":517},[112,60458,10309],{"class":229},[112,60460,1419],{"class":236},[112,60462,2445],{"class":129},[112,60464,10327],{"class":229},[112,60466,10330],{"class":118},[112,60468,10327],{"class":229},[112,60470,1054],{"class":129},[112,60472,59871],{"class":236},[112,60474,60475,60477,60479,60481,60483,60485,60487,60489,60491],{"class":114,"line":147},[112,60476,10341],{"class":517},[112,60478,10309],{"class":229},[112,60480,1419],{"class":236},[112,60482,2445],{"class":129},[112,60484,10327],{"class":229},[112,60486,10330],{"class":118},[112,60488,10327],{"class":229},[112,60490,1054],{"class":129},[112,60492,59871],{"class":236},[112,60494,60495,60497,60499,60501,60503,60505,60507,60509,60511],{"class":114,"line":202},[112,60496,59896],{"class":517},[112,60498,10309],{"class":229},[112,60500,1419],{"class":236},[112,60502,2445],{"class":129},[112,60504,10327],{"class":229},[112,60506,10330],{"class":118},[112,60508,10327],{"class":229},[112,60510,1054],{"class":129},[112,60512,59871],{"class":236},[112,60514,60515,60517,60519,60521,60523,60525,60527,60529,60531],{"class":114,"line":208},[112,60516,59917],{"class":517},[112,60518,10309],{"class":229},[112,60520,1419],{"class":236},[112,60522,2445],{"class":129},[112,60524,10327],{"class":229},[112,60526,10330],{"class":118},[112,60528,10327],{"class":229},[112,60530,1054],{"class":129},[112,60532,59871],{"class":236},[112,60534,60535,60537,60539,60541],{"class":114,"line":291},[112,60536,60089],{"class":517},[112,60538,10309],{"class":229},[112,60540,523],{"class":129},[112,60542,59978],{"class":236},[112,60544,60545,60548,60550,60552,60555,60557,60559,60561,60563],{"class":114,"line":299},[112,60546,60547],{"class":517},"  contact_id",[112,60549,10309],{"class":229},[112,60551,523],{"class":129},[112,60553,60554],{"class":236},";  ",[112,60556,637],{"class":517},[112,60558,10309],{"class":229},[112,60560,523],{"class":129},[112,60562,10369],{"class":236},[112,60564,60565],{"class":578},"// e.g. \"Cash Flow Statement Q1 2020\"  \n",[112,60567,60568,60570,60572,60574,60576],{"class":114,"line":307},[112,60569,59948],{"class":517},[112,60571,10309],{"class":229},[112,60573,523],{"class":129},[112,60575,10369],{"class":236},[112,60577,60578],{"class":578},"// ISO 4217, e.g. \"USD\"  \n",[112,60580,60581,60584,60586,60588,60590],{"class":114,"line":315},[112,60582,60583],{"class":517},"  cash_beginning_amount",[112,60585,10309],{"class":229},[112,60587,1054],{"class":129},[112,60589,10369],{"class":236},[112,60591,60592],{"class":578},"// Cash at beginning of period  \n",[112,60594,60595,60598,60600,60602,60604],{"class":114,"line":323},[112,60596,60597],{"class":517},"  cash_ending_amount",[112,60599,10309],{"class":229},[112,60601,1054],{"class":129},[112,60603,10369],{"class":236},[112,60605,60606],{"class":578},"// Cash at end of period  \n",[112,60608,60609,60612,60614,60616,60618],{"class":114,"line":329},[112,60610,60611],{"class":517},"  net_change_in_cash_amount",[112,60613,10309],{"class":229},[112,60615,1054],{"class":129},[112,60617,10369],{"class":236},[112,60619,60620],{"class":578},"// Usually ending - beginning  \n",[112,60622,60623,60626,60628,60631],{"class":114,"line":341},[112,60624,60625],{"class":517},"  operating_sections",[112,60627,10309],{"class":229},[112,60629,60630],{"class":118}," IAccountingCashflowSection",[112,60632,59978],{"class":236},[112,60634,60635,60638,60640,60642],{"class":114,"line":346},[112,60636,60637],{"class":517},"  investing_sections",[112,60639,10309],{"class":229},[112,60641,60630],{"class":118},[112,60643,59978],{"class":236},[112,60645,60646,60649,60651,60653,60656,60658,60660,60662],{"class":114,"line":366},[112,60647,60648],{"class":517},"  financing_sections",[112,60650,10309],{"class":229},[112,60652,60630],{"class":118},[112,60654,60655],{"class":236},"[];  ",[112,60657,42740],{"class":517},[112,60659,10309],{"class":229},[112,60661,10725],{"class":129},[112,60663,237],{"class":236},[112,60665,60666],{"class":114,"line":381},[112,60667,584],{"class":236},[112,60669,60670],{"class":114,"line":387},[112,60671,272],{"emptyLinePlaceholder":271},[112,60673,60674,60676,60678],{"class":114,"line":392},[112,60675,10296],{"class":229},[112,60677,60630],{"class":118},[112,60679,280],{"class":236},[112,60681,60682,60685,60687,60689,60691],{"class":114,"line":409},[112,60683,60684],{"class":517},"  section_name",[112,60686,10309],{"class":229},[112,60688,523],{"class":129},[112,60690,10369],{"class":236},[112,60692,60693],{"class":578},"// e.g. \"Operating Activities\"  \n",[112,60695,60696,60699,60701,60703,60705],{"class":114,"line":422},[112,60697,60698],{"class":517},"  total_amount",[112,60700,10309],{"class":229},[112,60702,1054],{"class":129},[112,60704,10369],{"class":236},[112,60706,60707],{"class":578},"// Net cash provided/used by this section  \n",[112,60709,60710,60713,60715,60718],{"class":114,"line":435},[112,60711,60712],{"class":517},"  items",[112,60714,10309],{"class":229},[112,60716,60717],{"class":118}," IAccountingCashflowItem",[112,60719,10420],{"class":236},[112,60721,60722],{"class":114,"line":440},[112,60723,584],{"class":236},[112,60725,60726],{"class":114,"line":4949},[112,60727,272],{"emptyLinePlaceholder":271},[112,60729,60730,60732,60734],{"class":114,"line":4960},[112,60731,10296],{"class":229},[112,60733,60717],{"class":118},[112,60735,280],{"class":236},[112,60737,60738,60741,60743,60745,60747],{"class":114,"line":4972},[112,60739,60740],{"class":517},"  account_id",[112,60742,10309],{"class":229},[112,60744,523],{"class":129},[112,60746,10369],{"class":236},[112,60748,60749],{"class":578},"// If attributable to a specific GL account  \n",[112,60751,60752,60754,60756,60758,60760],{"class":114,"line":4984},[112,60753,10362],{"class":517},[112,60755,10309],{"class":229},[112,60757,523],{"class":129},[112,60759,10369],{"class":236},[112,60761,60762],{"class":578},"// e.g. \"Net Income\", \"Depreciation\", \"Equipment\"  \n",[112,60764,60765,60768,60770,60772,60774],{"class":114,"line":4992},[112,60766,60767],{"class":517},"  amount",[112,60769,10309],{"class":229},[112,60771,1054],{"class":129},[112,60773,10369],{"class":236},[112,60775,60776],{"class":578},"// Positive = inflow, Negative = outflow  \n",[112,60778,60779,60782,60784,60786,60788],{"class":114,"line":5000},[112,60780,60781],{"class":517},"  transaction_ids",[112,60783,10309],{"class":229},[112,60785,523],{"class":129},[112,60787,14989],{"class":236},[112,60789,60790],{"class":578},"// Optional linkage to transactions  \n",[112,60792,60793,60795,60797,60799],{"class":114,"line":5008},[112,60794,60402],{"class":517},[112,60796,10309],{"class":229},[112,60798,60717],{"class":118},[112,60800,10420],{"class":236},[112,60802,60803],{"class":114,"line":5016},[112,60804,584],{"class":236},[19,60806,60807],{},[478,60808,54500],{},[72,60810,60811,60820,60829,60838,60846,60852,60857],{},[46,60812,60813,60815,60816,60819],{},[478,60814,54507],{}," Instead of using ",[109,60817,60818],{},"accounting_report"," endpoints, use the specific report endpoints",[46,60821,59588,60822,60825,60826],{},[109,60823,60824],{},"GET /accounting/report?type=BALANCE_SHEET",".  ✅ Use: ",[109,60827,60828],{},"GET /accounting/balancesheet",[46,60830,59588,60831,60834,60835],{},[109,60832,60833],{},"GET /accounting/report?type=PROFIT_AND_LOSS",". ✅ Use: ",[109,60836,60837],{},"GET /accounting/profitloss",[46,60839,59588,60840,60834,60843],{},[109,60841,60842],{},"GET /accounting/report?type=TRIAL_BALANCE",[109,60844,60845],{},"GET /accounting/trialbalance",[46,60847,59597,60848,60851],{},[109,60849,60850],{},"GET /accounting/cashflow"," (Cash flow was never part of the deprecated report object, but should be accessed directly)",[46,60853,60854,60856],{},[478,60855,54519],{}," Create individual report objects directly instead of wrapping them in a report object",[46,60858,60859,60862,60863,1046,60866,4670],{},[478,60860,60861],{},"Field Access:"," Access report data directly from the individual objects instead of through ",[109,60864,60865],{},"report.balance_sheet",[109,60867,60868],{},"report.profit_and_loss",[19,60870,60871],{},[478,60872,10603],{},[102,60874,60876],{"className":220,"code":60875,"language":222,"meta":107,"style":107},"// Before\nconst report = await getAccountingReport({\n  type: 'BALANCE_SHEET',  \n  start_at: '2024-01-01',  \n  end_at: '2024-12-31'\n});\nconst assets = report.balance_sheet?.assets;\n\n// After\nconst balanceSheet = await getAccountingBalancesheet({\n  start_at: '2024-01-01',  \n  end_at: '2024-12-31'\n});\nconst assets = balanceSheet.assets;\n",[109,60877,60878,60882,60898,60909,60918,60926,60930,60942,60946,60950,60966,60974,60980,60984],{"__ignoreMap":107},[112,60879,60880],{"class":114,"line":115},[112,60881,54540],{"class":578},[112,60883,60884,60886,60889,60891,60893,60896],{"class":114,"line":126},[112,60885,277],{"class":229},[112,60887,60888],{"class":129}," report",[112,60890,354],{"class":229},[112,60892,539],{"class":229},[112,60894,60895],{"class":118}," getAccountingReport",[112,60897,363],{"class":236},[112,60899,60900,60903,60906],{"class":114,"line":135},[112,60901,60902],{"class":236},"  type: ",[112,60904,60905],{"class":122},"'BALANCE_SHEET'",[112,60907,60908],{"class":236},",  \n",[112,60910,60911,60914,60916],{"class":114,"line":147},[112,60912,60913],{"class":236},"  start_at: ",[112,60915,57256],{"class":122},[112,60917,60908],{"class":236},[112,60919,60920,60923],{"class":114,"line":202},[112,60921,60922],{"class":236},"  end_at: ",[112,60924,60925],{"class":122},"'2024-12-31'\n",[112,60927,60928],{"class":114,"line":208},[112,60929,384],{"class":236},[112,60931,60932,60934,60937,60939],{"class":114,"line":291},[112,60933,277],{"class":229},[112,60935,60936],{"class":129}," assets",[112,60938,354],{"class":229},[112,60940,60941],{"class":236}," report.balance_sheet?.assets;\n",[112,60943,60944],{"class":114,"line":299},[112,60945,272],{"emptyLinePlaceholder":271},[112,60947,60948],{"class":114,"line":307},[112,60949,54579],{"class":578},[112,60951,60952,60954,60957,60959,60961,60964],{"class":114,"line":315},[112,60953,277],{"class":229},[112,60955,60956],{"class":129}," balanceSheet",[112,60958,354],{"class":229},[112,60960,539],{"class":229},[112,60962,60963],{"class":118}," getAccountingBalancesheet",[112,60965,363],{"class":236},[112,60967,60968,60970,60972],{"class":114,"line":323},[112,60969,60913],{"class":236},[112,60971,57256],{"class":122},[112,60973,60908],{"class":236},[112,60975,60976,60978],{"class":114,"line":329},[112,60977,60922],{"class":236},[112,60979,60925],{"class":122},[112,60981,60982],{"class":114,"line":341},[112,60983,384],{"class":236},[112,60985,60986,60988,60990,60992],{"class":114,"line":346},[112,60987,277],{"class":229},[112,60989,60936],{"class":129},[112,60991,354],{"class":229},[112,60993,60994],{"class":236}," balanceSheet.assets;\n",[19,60996,60997],{},[478,60998,60999],{},"Benefits of Using Individual Objects:",[72,61001,61002,61008,61014,61020],{},[46,61003,61004,61007],{},[478,61005,61006],{},"Simpler API:"," Each report type has its own dedicated endpoint",[46,61009,61010,61013],{},[478,61011,61012],{},"Better Type Safety:"," TypeScript can better infer types for specific report objects",[46,61015,61016,61019],{},[478,61017,61018],{},"Clearer Intent:"," Code is more explicit about which report type is being accessed",[46,61021,61022,61025],{},[478,61023,61024],{},"Easier Maintenance:"," Individual objects are easier to extend and modify independently",[16,61027],{},[67,61029,54369],{"id":61030},"deprecated-typesinterfaces",[35,61032,61034,11338,61036],{"id":61033},"iaccountingprofitlosscategory-and-iaccountingprofitlosssubcategory",[109,61035,58129],{},[109,61037,58132],{},[19,61039,61040,61042,61043],{},[478,61041,59752],{}," Deprecated types - These interfaces are deprecated in favor of ",[109,61044,58160],{},[19,61046,61047],{},[478,61048,61049],{},"Affected Files:",[72,61051,61052,61056,61065],{},[46,61053,61054],{},[109,61055,56937],{},[46,61057,61058,61061,61062,610],{},[109,61059,61060],{},"src/models/UnifiedAccounting.joi.ts"," (marked as ",[109,61063,61064],{},"@deprecated",[46,61066,61067],{},[109,61068,61069],{},"src/models/UnifiedAccounting.proto",[19,61071,61072],{},[478,61073,58138],{},[102,61075,61077],{"className":220,"code":61076,"language":222,"meta":107,"style":107},"interface IAccountingProfitlossCategory {\n  name?: string;  amount?: number;  sub_items?: IAccountingProfitlossSubcategory[];}\ninterface IAccountingProfitlossSubcategory {\n  name?: string;  amount?: number;  transaction_ids?: string[];}\n",[109,61078,61079,61087,61116,61124],{"__ignoreMap":107},[112,61080,61081,61083,61085],{"class":114,"line":115},[112,61082,10296],{"class":229},[112,61084,58218],{"class":118},[112,61086,280],{"class":236},[112,61088,61089,61091,61093,61095,61097,61099,61101,61103,61105,61108,61110,61113],{"class":114,"line":126},[112,61090,10362],{"class":517},[112,61092,10309],{"class":229},[112,61094,523],{"class":129},[112,61096,60554],{"class":236},[112,61098,20816],{"class":517},[112,61100,10309],{"class":229},[112,61102,1054],{"class":129},[112,61104,60554],{"class":236},[112,61106,61107],{"class":517},"sub_items",[112,61109,10309],{"class":229},[112,61111,61112],{"class":118}," IAccountingProfitlossSubcategory",[112,61114,61115],{"class":236},"[];}\n",[112,61117,61118,61120,61122],{"class":114,"line":135},[112,61119,10296],{"class":229},[112,61121,61112],{"class":118},[112,61123,280],{"class":236},[112,61125,61126,61128,61130,61132,61134,61136,61138,61140,61142,61145,61147,61149],{"class":114,"line":147},[112,61127,10362],{"class":517},[112,61129,10309],{"class":229},[112,61131,523],{"class":129},[112,61133,60554],{"class":236},[112,61135,20816],{"class":517},[112,61137,10309],{"class":229},[112,61139,1054],{"class":129},[112,61141,60554],{"class":236},[112,61143,61144],{"class":517},"transaction_ids",[112,61146,10309],{"class":229},[112,61148,523],{"class":129},[112,61150,61115],{"class":236},[19,61152,61153],{},[478,61154,54479],{},[102,61156,61158],{"className":220,"code":61157,"language":222,"meta":107,"style":107},"interface IAccountingProfitlossSection {\n  section_type?: string;  section_name?: string;  total_amount?: number;  accounts?: IAccountingProfitlossAccount[];}\ninterface IAccountingProfitlossAccount {\n  account_id?: string;  account_name?: string;  total_amount?: number;  transaction_ids?: string[];}\n",[109,61159,61160,61168,61207,61215],{"__ignoreMap":107},[112,61161,61162,61164,61166],{"class":114,"line":115},[112,61163,10296],{"class":229},[112,61165,58250],{"class":118},[112,61167,280],{"class":236},[112,61169,61170,61173,61175,61177,61179,61182,61184,61186,61188,61191,61193,61195,61197,61200,61202,61205],{"class":114,"line":126},[112,61171,61172],{"class":517},"  section_type",[112,61174,10309],{"class":229},[112,61176,523],{"class":129},[112,61178,60554],{"class":236},[112,61180,61181],{"class":517},"section_name",[112,61183,10309],{"class":229},[112,61185,523],{"class":129},[112,61187,60554],{"class":236},[112,61189,61190],{"class":517},"total_amount",[112,61192,10309],{"class":229},[112,61194,1054],{"class":129},[112,61196,60554],{"class":236},[112,61198,61199],{"class":517},"accounts",[112,61201,10309],{"class":229},[112,61203,61204],{"class":118}," IAccountingProfitlossAccount",[112,61206,61115],{"class":236},[112,61208,61209,61211,61213],{"class":114,"line":135},[112,61210,10296],{"class":229},[112,61212,61204],{"class":118},[112,61214,280],{"class":236},[112,61216,61217,61219,61221,61223,61225,61228,61230,61232,61234,61236,61238,61240,61242,61244,61246,61248],{"class":114,"line":147},[112,61218,60740],{"class":517},[112,61220,10309],{"class":229},[112,61222,523],{"class":129},[112,61224,60554],{"class":236},[112,61226,61227],{"class":517},"account_name",[112,61229,10309],{"class":229},[112,61231,523],{"class":129},[112,61233,60554],{"class":236},[112,61235,61190],{"class":517},[112,61237,10309],{"class":229},[112,61239,1054],{"class":129},[112,61241,60554],{"class":236},[112,61243,61144],{"class":517},[112,61245,10309],{"class":229},[112,61247,523],{"class":129},[112,61249,61115],{"class":236},[19,61251,61252],{},[478,61253,54500],{},[72,61255,61256,61261,61264],{},[46,61257,61258,61259],{},"Update TypeScript type definitions to use ",[109,61260,58160],{},[46,61262,61263],{},"Update code that creates or manipulates profit/loss categories to use sections instead",[46,61265,61266],{},"The new structure provides better organization with accounts grouped under sections",[16,61268],{},[67,61270,61272],{"id":61271},"summary-by-category","Summary by Category",[1868,61274,61275,61287],{},[1871,61276,61277],{},[1874,61278,61279,61281,61284],{},[1877,61280,12940],{},[1877,61282,61283],{},"Deprecated Fields Count",[1877,61285,61286],{},"Primary Changes",[1890,61288,61289,61307,61323,61342,61362,61373,61389,61401,61411,61423,61442],{},[1874,61290,61291,61294,61296],{},[1895,61292,61293],{},"Metadata",[1895,61295,26910],{},[1895,61297,61298,48940,61300,1046,61302,48940,61304,61306],{},[109,61299,54381],{},[109,61301,10832],{},[109,61303,2472],{},[109,61305,10518],{}," (affects 6 models)",[1874,61308,61309,61312,61315],{},[1895,61310,61311],{},"Parent/Relationship",[1895,61313,61314],{},"4",[1895,61316,61317,61318,48940,61321],{},"Various ",[109,61319,61320],{},"parent_*_id",[109,61322,38430],{},[1874,61324,61325,61328,61330],{},[1895,61326,61327],{},"HRIS",[1895,61329,25023],{},[1895,61331,61332,1046,61334,1046,61336,48940,61338,12874,61340],{},[109,61333,55542],{},[109,61335,55759],{},[109,61337,16573],{},[109,61339,55545],{},[109,61341,55947],{},[1874,61343,61344,61346,61348],{},[1895,61345,13321],{},[1895,61347,61314],{},[1895,61349,61350,1046,61352,1046,61354,1046,61356,48940,61358,12874,61360],{},[109,61351,56208],{},[109,61353,56217],{},[109,61355,55375],{},[109,61357,56432],{},[109,61359,56211],{},[109,61361,38430],{},[1874,61363,61364,61367,61370],{},[1895,61365,61366],{},"Accounting",[1895,61368,61369],{},"8",[1895,61371,61372],{},"Multiple field replacements and structural changes",[1874,61374,61375,61377,61379],{},[1895,61376,12248],{},[1895,61378,26910],{},[1895,61380,61381,48940,61383,1046,61385,48940,61387],{},[109,61382,58267],{},[109,61384,58270],{},[109,61386,58449],{},[109,61388,55545],{},[1874,61390,61391,61393,61395],{},[1895,61392,13457],{},[1895,61394,9165],{},[1895,61396,61397,48940,61399],{},[109,61398,58681],{},[109,61400,58684],{},[1874,61402,61403,61406,61408],{},[1895,61404,61405],{},"Query Parameters",[1895,61407,25023],{},[1895,61409,61410],{},"Date filter and expand parameter updates",[1874,61412,61413,61415,61417],{},[1895,61414,31764],{},[1895,61416,9165],{},[1895,61418,61419,48940,61421],{},[109,61420,18798],{},[109,61422,47602],{},[1874,61424,61425,61430,61434],{},[1895,61426,61427],{},[478,61428,61429],{},"Deprecated Objects",[1895,61431,61432],{},[478,61433,26910],{},[1895,61435,61436,44619,61438,1046,61440],{},[109,61437,56675],{},[109,61439,59540],{},[109,61441,59746],{},[1874,61443,61444,61449,61453],{},[1895,61445,61446],{},[478,61447,61448],{},"Deprecated Types",[1895,61450,61451],{},[478,61452,26910],{},[1895,61454,61455,1046,61457],{},[109,61456,58129],{},[109,61458,58132],{},[19,61460,61461],{},[478,61462,61463],{},"Total Deprecated Fields:",[72,61465,61466,61469,61472],{},[46,61467,61468],{},"27 unique fields",[46,61470,61471],{},"2 deprecated objects",[46,61473,61474],{},"2 deprecated types across all categories",[16,61476],{},[67,61478,61480],{"id":61479},"general-migration-guidelines","General Migration Guidelines",[35,61482,61484,61485],{"id":61483},"_1-backward-compatibility","1. ",[478,61486,61487],{},"Backward Compatibility",[72,61489,61490,61495],{},[46,61491,61492,61493],{},"Deprecated fields will still be supported until  ",[109,61494,54325],{},[46,61496,61497],{},"Plan to migrate as soon as possible to avoid breaking changes in future API versions",[35,61499,61501,61502],{"id":61500},"_2-testing","2. ",[478,61503,61504],{},"Testing",[72,61506,61507,61510],{},[46,61508,61509],{},"Test all migrations thoroughly in a development environment",[46,61511,61512],{},"Verify that data reads and writes work correctly with the new fields",[35,61514,61516,61517],{"id":61515},"_3-data-migration","3. ",[478,61518,61519],{},"Data Migration",[72,61521,61522],{},[46,61523,61524,61525],{},"For existing data using deprecated fields, consider:\n",[72,61526,61527,61530,61533],{},[46,61528,61529],{},"Running a one-time migration script to populate new fields from old fields",[46,61531,61532],{},"Updating your application code to read from both old and new fields during transition",[46,61534,61535],{},"Gradually migrating writes to use only new fields",[35,61537,61539],{"id":61538},"_4-documentation",[478,61540,61541],{},"4. Documentation",[72,61543,61544,61547,61550],{},[46,61545,61546],{},"Update your internal documentation and code comments",[46,61548,61549],{},"Notify your team about these changes",[46,61551,61552],{},"Update API integration tests to use new field names",[1558,61554,61555],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}",{"title":107,"searchDepth":126,"depth":126,"links":61557},[61558,61559,61565,61577,61585,61593,61613,61619,61623,61627,61635,61639,61640],{"id":54330,"depth":126,"text":54331},{"id":54374,"depth":126,"text":54336,"children":61560},[61561,61563],{"id":54377,"depth":135,"text":61562},"Field: key → slug",{"id":54609,"depth":135,"text":61564},"Field: type → format",{"id":54832,"depth":126,"text":54339,"children":61566},[61567,61569,61571,61573,61575],{"id":54835,"depth":135,"text":61568},"Field: parent_space_id → parent_id",{"id":54843,"depth":135,"text":61570},"Field: parent_page_id → parent_id",{"id":55047,"depth":135,"text":61572},"Field: parent_channel_id → parent_id",{"id":55210,"depth":135,"text":61574},"Field: parent_account_id → parent_id",{"id":55372,"depth":135,"text":61576},"Field: parent_message_id → parent_id",{"id":55536,"depth":126,"text":54342,"children":61578},[61579,61581,61583],{"id":55539,"depth":135,"text":61580},"Field: department → groups",{"id":55755,"depth":135,"text":61582},"Field:division → groups",{"id":55942,"depth":135,"text":61584},"Field: location → locations",{"id":56201,"depth":126,"text":56202,"children":61586},[61587,61589,61591],{"id":56205,"depth":135,"text":61588},"Field: channel_id → channels",{"id":56214,"depth":135,"text":61590},"Field: channel_ids → channels",{"id":56429,"depth":135,"text":61592},"Field: root_message_id → Removed",{"id":56655,"depth":126,"text":54348,"children":61594},[61595,61597,61599,61601,61603,61605,61607,61609,61611],{"id":56658,"depth":135,"text":61596},"Field: invoice_at → posted_at",{"id":56852,"depth":135,"text":61598},"Field: type → Removed",{"id":56918,"depth":135,"text":61600},"Field: contact_id → contacts",{"id":57136,"depth":135,"text":61602},"Field: income → income_sections",{"id":57383,"depth":135,"text":61604},"Field:expenses → expenses_sections",{"id":57575,"depth":135,"text":61606},"Field:cost_of_goods_sold → cost_of_goods_sold_sections",{"id":57767,"depth":135,"text":61608},"Field:gross_profit_amount → Calculate from income_total_amount and cost_of_goods_sold_total_amount",{"id":57984,"depth":135,"text":61610},"Field: net_profit_amount → net_income_amount",{"id":58126,"depth":135,"text":61612},"Field: IAccountingProfitlossCategory and IAccountingProfitlossSubcategory → Deprecated Types",{"id":58261,"depth":126,"text":54351,"children":61614},[61615,61617],{"id":58264,"depth":135,"text":61616},"Field:document_id → document_ids",{"id":58446,"depth":135,"text":61618},"Field: departments → groups",{"id":58675,"depth":126,"text":54354,"children":61620},[61621],{"id":58678,"depth":135,"text":61622},"Field: category → category_id",{"id":58853,"depth":126,"text":54357,"children":61624},[61625],{"id":58856,"depth":135,"text":61626},"Field:primary → is_primary",{"id":58919,"depth":126,"text":54360,"children":61628},[61629,61631,61633],{"id":58922,"depth":135,"text":61630},"expand_recurring_events → expand",{"id":59078,"depth":135,"text":61632},"end_le → end_lt",{"id":59743,"depth":135,"text":61634},"IAccountingReport → Use Individual Report Objects",{"id":61030,"depth":126,"text":54369,"children":61636},[61637],{"id":61033,"depth":135,"text":61638},"IAccountingProfitlossCategory and IAccountingProfitlossSubcategory",{"id":61271,"depth":126,"text":61272},{"id":61479,"depth":126,"text":61480,"children":61641},[61642,61644,61646,61648],{"id":61483,"depth":135,"text":61643},"1. Backward Compatibility",{"id":61500,"depth":135,"text":61645},"2. Testing",{"id":61515,"depth":135,"text":61647},"3. Data Migration",{"id":61538,"depth":135,"text":61541},"At Unified, we have always built our unified data-models with a lot of thoughtful attention to detail, so that they never have to be 'versioned' due to...",{"img":61651,"date":61652,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/notice_of_deprecation_of_fields_and_objects_nov_2025-icon.png","2025-11-10T00:00:00.000Z","/guides/notice_of_deprecation_of_fields_and_objects_nov_2025",{"title":54289,"description":61649},"guides/notice_of_deprecation_of_fields_and_objects_nov_2025","CmbBGLz59bM4D2F0645tw-uemuNUETaXtKhuNfErMs4",{"id":61658,"title":61659,"body":61660,"description":61852,"extension":1576,"meta":61853,"navigation":271,"path":61856,"seo":61857,"stem":61858,"__hash__":61859},"guides/guides/oracle_hcm_taleo_oauth_credentials_guide.md","Oracle HCM / Taleo OAuth Credentials Guide",{"type":9,"value":61661,"toc":61846},[61662,61665,61667,61672,61675,61684,61687,61693,61696,61704,61709,61715,61720,61723,61737,61740,61745,61765,61770,61773,61776,61779,61790,61795,61798,61804,61807,61813,61816,61824,61830],[12,61663,61659],{"id":61664},"oracle-hcm-taleo-oauth-credentials-guide",[16,61666],{},[19,61668,61669],{},[22,61670,61671],{},"April 6, 2026",[19,61673,61674],{},"To connect Oracle HCM / Taleo to Unified, you only need to collect these 3 values from Oracle:",[72,61676,61677,61679,61681],{},[46,61678,30971],{},[46,61680,30976],{},[46,61682,61683],{},"Servername",[19,61685,61686],{},"You will enter those directly into Unified.",[67,61688,61690],{"id":61689},"what-to-enter-in-unified",[478,61691,61692],{},"What To Enter In Unified",[19,61694,61695],{},"When creating the Oracle HCM / Taleo connection, fill in:",[72,61697,61698,61700,61702],{},[46,61699,30971],{},[46,61701,30976],{},[46,61703,61683],{},[19,61705,61706],{},[478,61707,61708],{},"Example Servername",[67,61710,61712],{"id":61711},"how-to-get-these-values-from-oracle",[478,61713,61714],{},"How To Get These Values From Oracle",[19,61716,61717],{},[478,61718,61719],{},"1. Find Your Servername",[19,61721,61722],{},"Ask your Oracle administrator for your Oracle Fusion HCM host name.",[19,61724,61725,61726,61729,61730],{},"It usually looks like:\n",[109,61727,61728],{},"\u003Ctenant>.fa.\u003Cregion>.oraclecloud.com","\nExample:\n",[1614,61731,61734],{"href":61732,"rel":61733},"https://example.fa.us2.oraclecloud.com/",[1618],[109,61735,61736],{},"example.fa.us2.oraclecloud.com",[19,61738,61739],{},"This exact value is what you should enter into Unified as the Servername.",[19,61741,61742],{},[478,61743,61744],{},"2. Create A Confidential Application In Oracle",[43,61746,61747,61750,61753,61756,61759,61762],{},[46,61748,61749],{},"Sign in to Oracle as an administrator",[46,61751,61752],{},"Open Integrated applications",[46,61754,61755],{},"Click Add application",[46,61757,61758],{},"Choose Confidential Application",[46,61760,61761],{},"Enter a name such as Unified Oracle HCM Integration",[46,61763,61764],{},"Continue through the setup",[19,61766,61767],{},[478,61768,61769],{},"3. Enable OAuth Client Access",[19,61771,61772],{},"During application setup, make sure OAuth client access is enabled for the application.",[19,61774,61775],{},"For this Unified connection, Oracle should issue credentials for a confidential application that can request access tokens for the HCM / Taleo APIs.",[19,61777,61778],{},"Your Oracle administrator may need to:",[72,61780,61781,61784,61787],{},[46,61782,61783],{},"enable OAuth for the app",[46,61785,61786],{},"allow the app to access the appropriate Oracle HCM / Taleo resources",[46,61788,61789],{},"activate the application once setup is complete",[19,61791,61792],{},[478,61793,61794],{},"4. Copy The Credentials",[19,61796,61797],{},"After the confidential application is created and activated, open the application details and copy:",[72,61799,61800,61802],{},[46,61801,30971],{},[46,61803,30976],{},[19,61805,61806],{},"These are the exact values to enter into Unified.",[67,61808,61810],{"id":61809},"final-checklist",[478,61811,61812],{},"Final Checklist",[19,61814,61815],{},"Before creating the connection in Unified, make sure you have:",[72,61817,61818,61820,61822],{},[46,61819,30971],{},[46,61821,30976],{},[46,61823,61683],{},[67,61825,61827],{"id":61826},"oraclereferences",[478,61828,61829],{},"Oracle References",[72,61831,61832,61839],{},[46,61833,61834,61835],{},"OAuth configuration: ",[1614,61836,61837],{"href":61837,"rel":61838},"https://docs.oracle.com/en/cloud/saas/applications-common/25d/oaext/configure-oauth.html",[1618],[46,61840,61841,61842],{},"HCM REST API: ",[1614,61843,61844],{"href":61844,"rel":61845},"https://docs.oracle.com/en/cloud/saas/human-resources/farws/index.html",[1618],{"title":107,"searchDepth":126,"depth":126,"links":61847},[61848,61849,61850,61851],{"id":61689,"depth":126,"text":61692},{"id":61711,"depth":126,"text":61714},{"id":61809,"depth":126,"text":61812},{"id":61826,"depth":126,"text":61829},"To connect Oracle HCM / Taleo to Unified, you only need to collect these 3 values from Oracle,",{"img":61854,"date":61855,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/oracle_hcm_taleo_oauth_credentials_guide-icon.png","2026-04-06T15:35:00.000Z","/guides/oracle_hcm_taleo_oauth_credentials_guide",{"title":61659,"description":61852},"guides/oracle_hcm_taleo_oauth_credentials_guide","wphXOczwENA26Iq3xzU6E8wOJjnGeGN41v9g99luzjE",{"id":61861,"title":61862,"body":61863,"description":61877,"extension":1576,"meta":62329,"navigation":271,"path":62332,"seo":62333,"stem":62334,"__hash__":62335},"guides/guides/retrieval_augmented_generation_rag.md","Retrieval-Augmented Generation (RAG)",{"type":9,"value":61864,"toc":62316},[61865,61868,61870,61875,61878,61881,61884,61907,61910,61914,61917,61920,61931,61934,61945,61948,61952,61955,61958,61974,61979,61985,61989,61992,61995,62009,62012,62015,62018,62021,62025,62028,62031,62050,62053,62056,62059,62063,62066,62069,62089,62092,62103,62106,62110,62113,62133,62141,62144,62146,62149,62152,62155,62159,62162,62175,62178,62189,62193,62196,62213,62216,62220,62223,62264,62267,62271,62306,62311],[12,61866,61862],{"id":61867},"retrieval-augmented-generation-rag",[16,61869],{},[19,61871,61872],{},[22,61873,61874],{},"February 13, 2026",[19,61876,61877],{},"This page explains how to implement a RAG pipeline using Unified.",[19,61879,61880],{},"RAG is an implementation pattern built on top of Unified APIs. Unified provides real-time data access and normalized objects. You are responsible for embeddings, vector storage, and retrieval.",[19,61882,61883],{},"At a high level, RAG with Unified follows this sequence:",[43,61885,61886,61889,61892,61895,61898,61901,61904],{},[46,61887,61888],{},"Subscribe to webhooks.",[46,61890,61891],{},"Receive created or updated objects.",[46,61893,61894],{},"Retrieve full content from the source API.",[46,61896,61897],{},"Chunk the content.",[46,61899,61900],{},"Generate embeddings.",[46,61902,61903],{},"Store embeddings in your vector database.",[46,61905,61906],{},"On query, retrieve relevant chunks and generate a response.",[19,61908,61909],{},"The pattern is the same across categories.",[67,61911,61913],{"id":61912},"what-rag-means-in-practice","What RAG Means in Practice",[19,61915,61916],{},"RAG allows you to answer questions using customer data from connected SaaS platforms.",[19,61918,61919],{},"Instead of relying only on model training data, your application:",[72,61921,61922,61925,61928],{},[46,61923,61924],{},"Retrieves relevant customer records.",[46,61926,61927],{},"Supplies those records as context.",[46,61929,61930],{},"Generates a response grounded in that context.",[19,61932,61933],{},"Unified enables real-time retrieval directly from source APIs and supports event-driven synchronization.",[72,61935,61936,61939,61942],{},[46,61937,61938],{},"Normalized across providers.",[46,61940,61941],{},"Fetched in real time.",[46,61943,61944],{},"Consistent in schema.",[19,61946,61947],{},"Unified does not store embeddings or maintain a vector index\nUnified Use Case RAG Pipelines.",[67,61949,61951],{"id":61950},"step-1-connect-data-sources","Step 1: Connect Data Sources",[19,61953,61954],{},"Authorize integrations using Embedded Auth.",[19,61956,61957],{},"Common RAG source categories include:",[72,61959,61960,61963,61966,61968,61970,61972],{},[46,61961,61962],{},"File Storage",[46,61964,61965],{},"Knowledge Management",[46,61967,13099],{},[46,61969,13457],{},[46,61971,12248],{},[46,61973,13321],{},[19,61975,61976,61977,634],{},"Each authorized integration returns a ",[109,61978,2886],{},[19,61980,61981,61982,61984],{},"RAG pipelines should treat ",[109,61983,2886],{}," as the tenant boundary.",[67,61986,61988],{"id":61987},"step-2-subscribe-to-object-updates","Step 2: Subscribe to Object Updates",[19,61990,61991],{},"Create webhook subscriptions for the objects you want to index.",[19,61993,61994],{},"On created or updated events:",[72,61996,61997,62000,62003],{},[46,61998,61999],{},"Your endpoint receives the event.",[46,62001,62002],{},"You call the appropriate retrieve endpoint to fetch the latest version of the object.",[46,62004,62005,62006,62008],{},"If the object contains a ",[109,62007,38494],{},", fetch the content from that URL.",[19,62010,62011],{},"List endpoints often return metadata but not full content. For RAG, you must explicitly retrieve full text before chunking.",[19,62013,62014],{},"Native webhooks deliver real-time updates.",[19,62016,62017],{},"Virtual webhooks provide the same interface using managed polling and may introduce short delays\nUnified Use Case RAG Pipelines.",[19,62019,62020],{},"Webhooks are recommended over polling for RAG ingestion.",[67,62022,62024],{"id":62023},"step-3-chunk-and-embed","Step 3: Chunk and Embed",[19,62026,62027],{},"Large text (files, pages, tickets, resumes, notes, transcripts) should be split into chunks before embedding.",[19,62029,62030],{},"Each chunk should include stable metadata such as:",[72,62032,62033,62037,62041,62046],{},[46,62034,62035],{},[109,62036,2886],{},[46,62038,62039],{},[109,62040,10476],{},[46,62042,62043],{},[109,62044,62045],{},"object_id",[46,62047,62048],{},[109,62049,32082],{},[19,62051,62052],{},"You may also include additional normalized fields as metadata filters.",[19,62054,62055],{},"Unified normalizes objects across providers. All normalized fields returned by Unified can be stored as metadata in your vector index and used for filtering at retrieval time.\nUnified Use Case RAG Pipelines.",[19,62057,62058],{},"You generate embeddings using the embedding model of your choice. Unified may provide access to embedding models, but embeddings and indexes are stored in your infrastructure.",[67,62060,62062],{"id":62061},"step-4-store-in-a-vector-database","Step 4: Store in a Vector Database",[19,62064,62065],{},"Store embeddings in your vector database (for example, Pinecone or pgvector).",[19,62067,62068],{},"Include metadata to support:",[72,62070,62071,62076,62081,62086],{},[46,62072,62073,62074,610],{},"Tenant isolation (",[109,62075,2886],{},[46,62077,62078,62079,610],{},"Object filtering (",[109,62080,10476],{},[46,62082,62083,62084,610],{},"Update replacement (",[109,62085,32082],{},[46,62087,62088],{},"Permission enforcement (see below)",[19,62090,62091],{},"Unified does not:",[72,62093,62094,62097,62100],{},[46,62095,62096],{},"Cache end-customer payloads",[46,62098,62099],{},"Store embeddings",[46,62101,62102],{},"Maintain a vector index Unified Use Case RAG Pipelines",[19,62104,62105],{},"Unified does not persist customer payloads or maintain your embedding index.",[67,62107,62109],{"id":62108},"step-5-retrieve-and-generate","Step 5: Retrieve and Generate",[19,62111,62112],{},"When a user submits a query:",[43,62114,62115,62118,62121,62127,62130],{},[46,62116,62117],{},"Embed the query.",[46,62119,62120],{},"Retrieve the top matching chunks from your vector database.",[46,62122,62123,62124,62126],{},"Filter by ",[109,62125,2886],{}," and any relevant metadata.",[46,62128,62129],{},"Pass retrieved context to your model.",[46,62131,62132],{},"Return the generated answer.",[19,62134,62135,62136,9571,62138,634],{},"If required, include citations that map back to ",[109,62137,62045],{},[109,62139,62140],{},"web_url",[19,62142,62143],{},"Unified does not perform retrieval. Unified ensures the indexed data remains synchronized with source APIs.",[67,62145,36137],{"id":26297},[19,62147,62148],{},"File objects include explicit permissions metadata.",[19,62150,62151],{},"Other objects (CRM, ATS, ticketing, messaging) do not return user- or group-level permission structures. If row-level enforcement is required, implement that logic in your application layer before returning retrieved results\nUnified Use Case RAG Pipelines.",[19,62153,62154],{},"Always filter retrieval results by tenant and permission constraints before generation.",[67,62156,62158],{"id":62157},"real-time-behavior","Real-Time Behavior",[19,62160,62161],{},"For RAG pipelines, freshness depends on update propagation:",[72,62163,62164,62166,62169],{},[46,62165,62014],{},[46,62167,62168],{},"Virtual webhooks use managed polling and typically operate with short delays.",[46,62170,62171,62172,62174],{},"Most list endpoints support pagination and incremental filtering via ",[109,62173,43862],{}," Unified Use Case RAG Pipelines.",[19,62176,62177],{},"To keep embeddings current:",[72,62179,62180,62183,62186],{},[46,62181,62182],{},"Re-fetch objects on update events.",[46,62184,62185],{},"Re-chunk and re-embed.",[46,62187,62188],{},"Replace outdated vectors in your index.",[67,62190,62192],{"id":62191},"when-to-use-rag","When to Use RAG",[19,62194,62195],{},"Use this pattern when you need to:",[72,62197,62198,62201,62204,62207,62210],{},[46,62199,62200],{},"Build enterprise search across connected platforms.",[46,62202,62203],{},"Ground AI responses in customer documents or records.",[46,62205,62206],{},"Enable resume or candidate search.",[46,62208,62209],{},"Support contract or document Q&A.",[46,62211,62212],{},"Build account-level CRM assistants.",[19,62214,62215],{},"The ingestion architecture is consistent across categories. Object models and content retrieval methods vary by API.",[67,62217,62219],{"id":62218},"related-apis","Related APIs",[19,62221,62222],{},"RAG pipelines commonly use:",[72,62224,62225,62232,62238,62245,62252,62258],{},[46,62226,62227],{},[1614,62228,62231],{"href":62229,"rel":62230},"https://docs.unified.to/storage/overview",[1618],"File Storage API",[46,62233,62234],{},[1614,62235,62237],{"href":17923,"rel":62236},[1618],"Knowledge Management API",[46,62239,62240],{},[1614,62241,62244],{"href":62242,"rel":62243},"https://docs.unified.to/crm/overview",[1618],"CRM API",[46,62246,62247],{},[1614,62248,62251],{"href":62249,"rel":62250},"https://docs.unified.to/ticketing/overview",[1618],"Ticketing API",[46,62253,62254],{},[1614,62255,62257],{"href":16951,"rel":62256},[1618],"ATS API",[46,62259,62260],{},[1614,62261,62263],{"href":19650,"rel":62262},[1618],"Messaging API",[19,62265,62266],{},"Refer to category documentation for supported objects and webhook availability.",[67,62268,62270],{"id":62269},"related-guides","Related Guides",[72,62272,62273,62279,62285,62292,62299],{},[46,62274,62275],{},[1614,62276,23215],{"href":62277,"rel":62278},"https://unified.to/blog/how_to_build_enterprise_search_using_rag",[1618],[46,62280,62281],{},[1614,62282,7],{"href":62283,"rel":62284},"https://unified.to/blog/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data",[1618],[46,62286,62287],{},[1614,62288,62291],{"href":62289,"rel":62290},"https://unified.to/blog/how_to_build_an_ai_powered_meeting_recording_summarization_with_unified",[1618],"How to Build an AI-Powered Meeting Recording Summarization",[46,62293,62294],{},[1614,62295,62298],{"href":62296,"rel":62297},"https://unified.to/blog/how_to_train_ai_with_crm_data_using_unified_crm_api",[1618],"How to Train AI with CRM Data using Unified's CRM API",[46,62300,62301],{},[1614,62302,62305],{"href":62303,"rel":62304},"https://unified.to/blog/how_to_train_ai_with_hris_data_with_unified_hr_and_directory_api",[1618],"How to Train AI with HRIS Data with Unified's HR & Directory API",[19,62307,62308],{},[1614,62309,44506],{"href":12214,"rel":62310},[1618],[19,62312,62313],{},[1614,62314,44512],{"href":33418,"rel":62315},[1618],{"title":107,"searchDepth":126,"depth":126,"links":62317},[62318,62319,62320,62321,62322,62323,62324,62325,62326,62327,62328],{"id":61912,"depth":126,"text":61913},{"id":61950,"depth":126,"text":61951},{"id":61987,"depth":126,"text":61988},{"id":62023,"depth":126,"text":62024},{"id":62061,"depth":126,"text":62062},{"id":62108,"depth":126,"text":62109},{"id":26297,"depth":126,"text":36137},{"id":62157,"depth":126,"text":62158},{"id":62191,"depth":126,"text":62192},{"id":62218,"depth":126,"text":62219},{"id":62269,"depth":126,"text":62270},{"img":62330,"date":62331,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/retrieval_augmented_generation_rag-icon.png","2026-02-13T01:40:00.000Z","/guides/retrieval_augmented_generation_rag",{"title":61862,"description":61877},"guides/retrieval_augmented_generation_rag","RNs_vVn9kPMyFgw8n38srRxCMvLoMoC6XKyM7DQah9E",{"id":62337,"title":62338,"body":62339,"description":62821,"extension":1576,"meta":62822,"navigation":271,"path":62825,"seo":62826,"stem":62827,"__hash__":62828},"guides/guides/saml_single_sign_on.md","SAML Single-Sign-On",{"type":9,"value":62340,"toc":62813},[62341,62344,62346,62351,62354,62365,62368,62374,62379,62404,62409,62412,62415,62418,62421,62426,62496,62501,62532,62537,62557,62562,62588,62593,62598,62609,62614,62625,62628,62634,62639,62645,62666,62694,62700,62703,62764,62770,62792,62796,62799,62807,62810],[12,62342,62338],{"id":62343},"saml-single-sign-on",[16,62345],{},[19,62347,62348],{},[22,62349,62350],{},"September 28, 2025",[19,62352,62353],{},"SAML (Security Assertion Markup Language) is an XML-based standard for exchanging authentication and authorization data between parties, particularly between an identity provider (IdP) and a service provider (SP).",[19,62355,62356,62359,62360,62364],{},[1614,62357,1640],{"href":1638,"rel":62358},[1618]," currently supports JumpCloud SAML.  ",[1614,62361,62363],{"href":11505,"rel":62362},[1618],"Let us know"," if you need another SAML identity provider.",[19,62366,62367],{},"Here's how SAML works:",[67,62369,62371],{"id":62370},"saml-authentication-flow",[478,62372,62373],{},"SAML Authentication Flow",[19,62375,62376],{},[478,62377,62378],{},"Key Components:",[43,62380,62381,62387,62393,62398],{},[46,62382,62383,62386],{},[478,62384,62385],{},"Identity Provider (IdP)"," - The system that authenticates users (e.g., Active Directory, Okta, Azure AD)",[46,62388,62389,62392],{},[478,62390,62391],{},"Service Provider (SP)"," - The application the user wants to access (e.g., your Unified.to app)",[46,62394,62395,62397],{},[478,62396,54101],{}," - The person trying to log in",[46,62399,62400,62403],{},[478,62401,62402],{},"SAML Assertion"," - XML document containing authentication/authorization information",[19,62405,62406],{},[478,62407,62408],{},"Typical SAML SSO Flow:",[19,62410,62411],{},"1. User → SP: \"I want to access the application\"",[19,62413,62414],{},"2. SP → User: Redirect to IdP with SAML AuthnRequest",[19,62416,62417],{},"3. User → IdP: Login with credentials",[19,62419,62420],{},"4. IdP → User: Redirect back to SP with SAML Response/Assertion",[19,62422,62423],{},[478,62424,62425],{},"Detailed Steps:",[43,62427,62428,62441,62454,62467,62480],{},[46,62429,62430,62433],{},[478,62431,62432],{},"User Access Request",[72,62434,62435,62438],{},[46,62436,62437],{},"User visits your application and clicks \"SAML SSO\" login",[46,62439,62440],{},"Application generates a SAML Authentication Request (AuthnRequest)",[46,62442,62443,62446],{},[478,62444,62445],{},"Redirect to Identity Provider",[72,62447,62448,62451],{},[46,62449,62450],{},"User is redirected to their organization's IdP",[46,62452,62453],{},"AuthnRequest contains information about the SP and requested attributes",[46,62455,62456,62459],{},[478,62457,62458],{},"User Authentication",[72,62460,62461,62464],{},[46,62462,62463],{},"User enters their organizational credentials",[46,62465,62466],{},"IdP validates the credentials",[46,62468,62469,62472],{},[478,62470,62471],{},"SAML Response Generation",[72,62473,62474,62477],{},[46,62475,62476],{},"IdP creates a SAML Response containing a SAML Assertion",[46,62478,62479],{},"Assertion includes user identity, authentication method, session info, etc.",[46,62481,62482,62485],{},[478,62483,62484],{},"Response Processing",[72,62486,62487,62490,62493],{},[46,62488,62489],{},"IdP redirects user back to SP with the SAML Response",[46,62491,62492],{},"SP validates the assertion signature and extracts user information",[46,62494,62495],{},"User is logged into the application",[19,62497,62498],{},[478,62499,62500],{},"SAML Assertion Contents:",[72,62502,62503,62508,62514,62520,62526],{},[46,62504,62505,62507],{},[478,62506,35634],{},": Who the user is (NameID, email, etc.)",[46,62509,62510,62513],{},[478,62511,62512],{},"Authentication Statement",": How they were authenticated",[46,62515,62516,62519],{},[478,62517,62518],{},"Attribute Statement",": Additional user attributes (roles, groups, etc.)",[46,62521,62522,62525],{},[478,62523,62524],{},"Conditions",": Validity period, audience restrictions",[46,62527,62528,62531],{},[478,62529,62530],{},"Signature",": Cryptographic proof of authenticity",[19,62533,62534],{},[478,62535,62536],{},"Common SAML Bindings:",[72,62538,62539,62545,62551],{},[46,62540,62541,62544],{},[478,62542,62543],{},"HTTP Redirect",": Data passed via URL parameters",[46,62546,62547,62550],{},[478,62548,62549],{},"HTTP POST",": Data posted in form fields",[46,62552,62553,62556],{},[478,62554,62555],{},"HTTP Artifact",": Reference token exchanged for full assertion",[19,62558,62559],{},[478,62560,62561],{},"Security Features:",[72,62563,62564,62570,62576,62582],{},[46,62565,62566,62569],{},[478,62567,62568],{},"Digital Signatures",": Ensure assertions haven't been tampered with",[46,62571,62572,62575],{},[478,62573,62574],{},"Encryption",": Protect sensitive data in transit",[46,62577,62578,62581],{},[478,62579,62580],{},"Time-based Conditions",": Assertions expire after set time",[46,62583,62584,62587],{},[478,62585,62586],{},"Audience Restrictions",": Limit which SPs can use the assertion",[19,62589,62590],{},[478,62591,62592],{},"Configuration Requirements:",[19,62594,62595],{},[478,62596,62597],{},"For Service Provider (your app):",[72,62599,62600,62603,62606],{},[46,62601,62602],{},"SAML metadata XML with entity ID, ACS URL, certificate",[46,62604,62605],{},"User attribute mapping (email, name, roles)",[46,62607,62608],{},"Certificate for signature validation",[19,62610,62611],{},[478,62612,62613],{},"For Identity Provider:",[72,62615,62616,62619,62622],{},[46,62617,62618],{},"SP metadata containing endpoints and certificate",[46,62620,62621],{},"User attribute configuration",[46,62623,62624],{},"SSO URL configuration",[19,62626,62627],{},"This is why SAML is popular for enterprise SSO - it provides secure, standardized authentication that integrates with existing corporate identity systems without requiring users to manage separate passwords for each application.",[67,62629,62631],{"id":62630},"jumpcloud-saml-integration-setup",[478,62632,62633],{},"JumpCloud SAML Integration Setup",[19,62635,62636],{},[478,62637,62638],{},"1. JumpCloud Configuration (Identity Provider Side)",[35,62640,62642],{"id":62641},"step-1-create-sso-application-in-jumpcloud",[478,62643,62644],{},"Step 1: Create SSO Application in JumpCloud",[43,62646,62647,62650,62655,62660,62663],{},[46,62648,62649],{},"Log into JumpCloud Admin Portal",[46,62651,34102,62652],{},[478,62653,62654],{},"SSO Applications",[46,62656,33709,62657],{},[478,62658,62659],{},"+ Add New Application",[46,62661,62662],{},"Search for \"Custom SAML Application\" or \"Custom App\"",[46,62664,62665],{},"Configure the application:",[72,62667,62668,62674,62684],{},[46,62669,62670,62673],{},[478,62671,62672],{},"Display Label",": \"Unified.to\" (or your app name)",[46,62675,62676,35849,62679,62683],{},[478,62677,62678],{},"IdP Entity ID",[1614,62680,62681],{"href":62681,"rel":62682},"https://sso.jumpcloud.com/saml2/unified-to",[1618]," (or your preferred ID)",[46,62685,62686,62689,62690,610],{},[478,62687,62688],{},"SP Entity ID",": Your application's entity ID (e.g., ",[1614,62691,62692],{"href":62692,"rel":62693},"https://api.unified.to/saml/metadata",[1618],[35,62695,62697],{"id":62696},"step-2-configure-saml-attributes",[478,62698,62699],{},"Step 2: Configure SAML Attributes",[19,62701,62702],{},"In the JumpCloud SSO configuration:",[72,62704,62705,62715,62723,62729],{},[46,62706,62707,35849,62710,62714],{},[478,62708,62709],{},"ACS URL",[1614,62711,62712],{"href":62712,"rel":62713},"https://api.unified.to/saml/acs",[1618]," (your assertion consumer service endpoint)",[46,62716,62717,35849,62720],{},[478,62718,62719],{},"Audience",[1614,62721,62692],{"href":62692,"rel":62722},[1618],[46,62724,62725,62728],{},[478,62726,62727],{},"Name ID Format",": urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",[46,62730,62731,43327,62734],{},[478,62732,62733],{},"Attribute Mappings",[72,62735,62736,62743,62750,62757],{},[46,62737,62738,62739],{},"email → ",[1614,62740,62741],{"href":62741,"rel":62742},"https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",[1618],[46,62744,62745,62746],{},"firstName → ",[1614,62747,62748],{"href":62748,"rel":62749},"https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname",[1618],[46,62751,62752,62753],{},"lastName → ",[1614,62754,62755],{"href":62755,"rel":62756},"https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname",[1618],[46,62758,62759,62760],{},"username → ",[1614,62761,62762],{"href":62762,"rel":62763},"https://schemas.xmlsoap.org/ws/2005/05/identity/claims/name",[1618],[35,62765,62767],{"id":62766},"step-3-get-jumpcloud-metadata",[478,62768,62769],{},"Step 3: Get JumpCloud Metadata",[72,62771,62772,62775,62785],{},[46,62773,62774],{},"Download the IdP metadata XML from JumpCloud",[46,62776,62777,62778,62781,62782,610],{},"Note the ",[478,62779,62780],{},"SSO URL"," (usually ",[1614,62783,62681],{"href":62681,"rel":62784},[1618],[46,62786,62787,62788,62791],{},"Get the ",[478,62789,62790],{},"X.509 Certificate"," for signature validation",[12,62793,62795],{"id":62794},"configure-saml-on-unified","Configure SAML on Unified",[19,62797,62798],{},"If you haven't registered an account, sign-in with any of our available Social or OAuth2 OIDC login options.  Make sure to choose the relevant data region.",[19,62800,62801,62802,634],{},"Then proceed to the workspace settings and choose ",[1614,62803,62806],{"href":62804,"rel":62805},"https://app.unified.to/settings/saml",[1618],"SAML",[19,62808,62809],{},"Select your Identity Provider. Either upload the SAML manifest XML file or input the SAML configuration settings from your identity provider.",[19,62811,62812],{},"You can choose  to restrict sign-ins to just SAML for your workspace. All existing and invited workspace members will then need to sign-in with SAML.",{"title":107,"searchDepth":126,"depth":126,"links":62814},[62815,62816],{"id":62370,"depth":126,"text":62373},{"id":62630,"depth":126,"text":62633,"children":62817},[62818,62819,62820],{"id":62641,"depth":135,"text":62644},{"id":62696,"depth":135,"text":62699},{"id":62766,"depth":135,"text":62769},"SAML (Security Assertion Markup Language) is an XML-based standard for exchanging authentication and authorization data between parties, particularly between...",{"img":62823,"date":62824,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/saml_single_sign_on-icon.webp","2025-09-28T00:00:00.000Z","/guides/saml_single_sign_on",{"title":62338,"description":62821},"guides/saml_single_sign_on","3stz87hhc5mJ9sxJoMwoOWA8qSlrpQlL83Cmd9ZCLzM",{"id":62830,"title":62831,"body":62832,"description":63905,"extension":1576,"meta":63906,"navigation":271,"path":63909,"seo":63910,"stem":63911,"__hash__":63912},"guides/guides/scaling_mcp_tools_with_anthropic_defer_loading.md","Scaling MCP Tools with Anthropic's Defer Loading",{"type":9,"value":62833,"toc":63885},[62834,62837,62839,62844,62851,62860,62863,62877,62883,62887,62890,62893,62904,62908,62914,62918,62926,62937,62945,62956,62959,62985,62989,63004,63023,63079,63087,63213,63227,63240,63243,63247,63250,63254,63257,63285,63289,63295,63302,63306,63309,63398,63402,63410,63457,63461,63464,63490,63494,63499,63516,63521,63532,63536,63539,63803,63805,63841,63845,63850,63876,63879,63882],[12,62835,62831],{"id":62836},"scaling-mcp-tools-with-anthropics-defer-loading",[16,62838],{},[19,62840,62841],{},[22,62842,62843],{},"December 25, 2025",[19,62845,62846,62847,62850],{},"Learn how to use Anthropic's ",[109,62848,62849],{},"defer_loading"," tool search features with Unified's MCP server to efficiently manage hundreds of tools while maintaining high accuracy and context efficiency.",[19,62852,62853,62854,62859],{},"When building AI applications with MCP servers, including the ",[1614,62855,62858],{"href":62856,"rel":62857},"https://www.notion.so/mcp/overview",[1618],"Unified MCP server",", you quickly encounter a critical challenge: most LLM models struggle with large numbers of tools.",[19,62861,62862],{},"While Unified can provide thousands of tools across different integrations, traditional approaches hit two key limitations:",[72,62864,62865,62871],{},[46,62866,62867,62870],{},[478,62868,62869],{},"Context window bloat",": Tool definitions consume massive portions of your context (50 tools ≈ 10-20K tokens)",[46,62872,62873,62876],{},[478,62874,62875],{},"Tool selection degradation",": An LLM's ability to correctly select tools degrades significantly beyond 30-50 tools",[19,62878,62879,62880,62882],{},"Anthropic's new ",[478,62881,62849],{}," feature solves both first problems by dynamically discovering and loading tools on-demand instead of loading all tool definitions upfront.",[67,62884,62886],{"id":62885},"the-problem-too-many-tools","The Problem: Too Many Tools",[19,62888,62889],{},"The Unified MCP server can expose tools from any connected integration— CRM, ATS, HRIS, ticketing, storage, and more. A single connection might offer 50+ tools, and with multiple integrations, you could easily have 200+ available tools.  Overall, the Unified MCP server currently support more than 22,000 tools.",[19,62891,62892],{},"Traditional approach problems:",[72,62894,62895,62898,62901],{},[46,62896,62897],{},"Loading 200 tool definitions uses 40,000-80,000 tokens",[46,62899,62900],{},"The LLM API struggles to select the correct tool from such a large set",[46,62902,62903],{},"You waste context on tools that won't be used in that conversation",[67,62905,62907],{"id":62906},"the-solution-anthropics-defer-loading-tool-search","The Solution: Anthropic's Defer Loading Tool Search",[19,62909,62910,62911,62913],{},"Anthropic's ",[109,62912,62849],{}," feature works with two tool search variants:",[35,62915,62917],{"id":62916},"tool-search-variants","Tool Search Variants",[19,62919,62920,1419,62923,610],{},[478,62921,62922],{},"1. Regex Tool Search",[109,62924,62925],{},"tool_search_tool_regex_20251119",[72,62927,62928,62931,62934],{},[46,62929,62930],{},"Claude constructs regex patterns to search for tools",[46,62932,62933],{},"Best for exact matches and pattern-based discovery",[46,62935,62936],{},"Fast and efficient for well-named tools",[19,62938,62939,1419,62942,610],{},[478,62940,62941],{},"2. BM25 Tool Search",[109,62943,62944],{},"tool_search_tool_bm25_20251119",[72,62946,62947,62950,62953],{},[46,62948,62949],{},"Claude uses natural language queries to search",[46,62951,62952],{},"Better for semantic understanding",[46,62954,62955],{},"More flexible for varied naming conventions",[35,62957,62958],{"id":45638},"How It Works",[43,62960,62961,62964,62970,62973,62976,62979,62982],{},[46,62962,62963],{},"You include a tool search tool in your tools list",[46,62965,62966,62967],{},"You provide all tool definitions with ",[109,62968,62969],{},"defer_loading: true",[46,62971,62972],{},"Claude sees only the tool search tool initially",[46,62974,62975],{},"When Claude needs additional tools, it searches dynamically",[46,62977,62978],{},"The API returns 3-5 most relevant tools",[46,62980,62981],{},"These are automatically expanded into full definitions",[46,62983,62984],{},"Claude selects and invokes the appropriate tool",[67,62986,62988],{"id":62987},"implementation","Implementation",[19,62990,62991,62992,62994,62995,62999,63000,63003],{},"To use the new ",[109,62993,62849],{}," tool option, follow these instructions (found ",[1614,62996,17258],{"href":62997,"rel":62998},"https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool#mcp-integration",[1618],") when calling Anthropic's ",[109,63001,63002],{},"/v1/messages"," API:",[72,63005,63006,63020],{},[46,63007,63008,63009,63012,63013,63016,63017],{},"Add ",[109,63010,63011],{},"\"mcp-client-2025-11-20\"","  to the ",[109,63014,63015],{},"anthropic-beta"," header:\n",[109,63018,63019],{},"anthropic-beta: advanced-tool-use-2025-11-20,mcp-client-2025-11-20",[46,63021,63022],{},"Add the Unified MCP server's URL as usual",[102,63024,63026],{"className":2318,"code":63025,"language":2320,"meta":107,"style":107},"\"mcp_servers\": [\n  {\n    \"type\": \"url\",\n    \"name\": \"unified-salesforce-server\",\n    \"url\": \"https://mcp-api.unified.to?token=x&connection=y\"\n  }\n],\n",[109,63027,63028,63035,63039,63050,63061,63071,63075],{"__ignoreMap":107},[112,63029,63030,63033],{"class":114,"line":115},[112,63031,63032],{"class":122},"\"mcp_servers\"",[112,63034,2372],{"class":236},[112,63036,63037],{"class":114,"line":126},[112,63038,26155],{"class":236},[112,63040,63041,63043,63045,63048],{"class":114,"line":135},[112,63042,26160],{"class":129},[112,63044,2335],{"class":236},[112,63046,63047],{"class":122},"\"url\"",[112,63049,288],{"class":236},[112,63051,63052,63054,63056,63059],{"class":114,"line":147},[112,63053,26184],{"class":129},[112,63055,2335],{"class":236},[112,63057,63058],{"class":122},"\"unified-salesforce-server\"",[112,63060,288],{"class":236},[112,63062,63063,63066,63068],{"class":114,"line":202},[112,63064,63065],{"class":129},"    \"url\"",[112,63067,2335],{"class":236},[112,63069,63070],{"class":122},"\"https://mcp-api.unified.to?token=x&connection=y\"\n",[112,63072,63073],{"class":114,"line":208},[112,63074,1476],{"class":236},[112,63076,63077],{"class":114,"line":291},[112,63078,3908],{"class":236},[72,63080,63081],{},[46,63082,63083,63084,63086],{},"Then add an additional ",[109,63085,26303],{}," array with configuration on which tools to defer:",[102,63088,63090],{"className":2318,"code":63089,"language":2320,"meta":107,"style":107},"\"tools\": [\n  {\n    \"type\": \"tool_search_tool_regex_20251119\",\n    \"name\": \"tool_search_tool_regex\"\n  },\n  {\n    \"type\": \"mcp_toolset\",\n    \"mcp_server_name\": \"unified-salesforce-server\",\n    \"default_config\": {\n      \"defer_loading\": true\n    },\n    \"configs\": {\n      \"list_crm_contacts\": {\n        \"defer_loading\": false\n      }\n    }\n  }\n],\n",[109,63091,63092,63099,63103,63114,63123,63127,63131,63142,63153,63160,63169,63173,63180,63187,63197,63201,63205,63209],{"__ignoreMap":107},[112,63093,63094,63097],{"class":114,"line":115},[112,63095,63096],{"class":122},"\"tools\"",[112,63098,2372],{"class":236},[112,63100,63101],{"class":114,"line":126},[112,63102,26155],{"class":236},[112,63104,63105,63107,63109,63112],{"class":114,"line":135},[112,63106,26160],{"class":129},[112,63108,2335],{"class":236},[112,63110,63111],{"class":122},"\"tool_search_tool_regex_20251119\"",[112,63113,288],{"class":236},[112,63115,63116,63118,63120],{"class":114,"line":147},[112,63117,26184],{"class":129},[112,63119,2335],{"class":236},[112,63121,63122],{"class":122},"\"tool_search_tool_regex\"\n",[112,63124,63125],{"class":114,"line":202},[112,63126,9512],{"class":236},[112,63128,63129],{"class":114,"line":208},[112,63130,26155],{"class":236},[112,63132,63133,63135,63137,63140],{"class":114,"line":291},[112,63134,26160],{"class":129},[112,63136,2335],{"class":236},[112,63138,63139],{"class":122},"\"mcp_toolset\"",[112,63141,288],{"class":236},[112,63143,63144,63147,63149,63151],{"class":114,"line":299},[112,63145,63146],{"class":129},"    \"mcp_server_name\"",[112,63148,2335],{"class":236},[112,63150,63058],{"class":122},[112,63152,288],{"class":236},[112,63154,63155,63158],{"class":114,"line":307},[112,63156,63157],{"class":129},"    \"default_config\"",[112,63159,3888],{"class":236},[112,63161,63162,63165,63167],{"class":114,"line":315},[112,63163,63164],{"class":129},"      \"defer_loading\"",[112,63166,2335],{"class":236},[112,63168,4144],{"class":129},[112,63170,63171],{"class":114,"line":323},[112,63172,988],{"class":236},[112,63174,63175,63178],{"class":114,"line":329},[112,63176,63177],{"class":129},"    \"configs\"",[112,63179,3888],{"class":236},[112,63181,63182,63185],{"class":114,"line":341},[112,63183,63184],{"class":129},"      \"list_crm_contacts\"",[112,63186,3888],{"class":236},[112,63188,63189,63192,63194],{"class":114,"line":346},[112,63190,63191],{"class":129},"        \"defer_loading\"",[112,63193,2335],{"class":236},[112,63195,63196],{"class":129},"false\n",[112,63198,63199],{"class":114,"line":366},[112,63200,17649],{"class":236},[112,63202,63203],{"class":114,"line":381},[112,63204,3946],{"class":236},[112,63206,63207],{"class":114,"line":387},[112,63208,1476],{"class":236},[112,63210,63211],{"class":114,"line":392},[112,63212,3908],{"class":236},[72,63214,63215,63221],{},[46,63216,2604,63217,63220],{},[109,63218,63219],{},"default_config.defer_loading: true"," option to make all tools deferrable",[46,63222,2604,63223,63226],{},[109,63224,63225],{},"configs.{tool_id}.defer_loading: true/false"," to set an individual tool to defer (or not)",[19,63228,63229,63230,63232,63233,63236,63237,63239],{},"Or, alternatively, you can call the Unified MCP ",[109,63231,26078],{}," endpoint with parameters ",[109,63234,63235],{},"?type=anthropic&defer_tools=all"," and then feed that ",[109,63238,26303],{}," result into Anthropic's API.",[67,63241,63242],{"id":10074},"Best Practices",[35,63244,63246],{"id":63245},"_1-keep-core-tools-non-deferred","1. Keep Core Tools Non-Deferred",[19,63248,63249],{},"If you have 3-5 tools that are frequently used, keep them as non-deferred.",[35,63251,63253],{"id":63252},"_2-use-permissions-to-scope-tools","2. Use Permissions to Scope Tools",[19,63255,63256],{},"Reduce the tool catalog size by requesting only the permissions you need:",[102,63258,63260],{"className":220,"code":63259,"language":222,"meta":107,"style":107},"// Instead of all tools across all categories\npermissions: 'crm_contact_read,crm_contact_write,crm_deal_read'\n\n// This is better than loading 200+ tools from all categories\n",[109,63261,63262,63267,63276,63280],{"__ignoreMap":107},[112,63263,63264],{"class":114,"line":115},[112,63265,63266],{"class":578},"// Instead of all tools across all categories\n",[112,63268,63269,63271,63273],{"class":114,"line":126},[112,63270,26297],{"class":118},[112,63272,2335],{"class":236},[112,63274,63275],{"class":122},"'crm_contact_read,crm_contact_write,crm_deal_read'\n",[112,63277,63278],{"class":114,"line":135},[112,63279,272],{"emptyLinePlaceholder":271},[112,63281,63282],{"class":114,"line":147},[112,63283,63284],{"class":578},"// This is better than loading 200+ tools from all categories\n",[35,63286,63288],{"id":63287},"_3-restrict-tools","3. Restrict Tools",[19,63290,63291,63292,63294],{},"Use the Unified MCP ",[109,63293,26303],{}," parameter to restrict which tools will be returned back to the LLM API.",[19,63296,63297,63298,63301],{},"This has a different effect than the ",[109,63299,63300],{},"defer_tools"," parameter as it doesn't return restricted tools to the LLM API at all, while deferring tools means that the LLM API knows about the tool, but doesnt process it until it is needed.",[35,63303,63305],{"id":63304},"_4-monitor-token-usage","4. Monitor Token Usage",[19,63307,63308],{},"Track your token consumption to understand the benefits:",[102,63310,63312],{"className":220,"code":63311,"language":222,"meta":107,"style":107},"console.log(`Input tokens: ${response.usage.input_tokens}`);\nconsole.log(`Output tokens: ${response.usage.output_tokens}`);\nconsole.log(`Tool search requests: ${response.usage.server_tool_use?.tool_search_requests}`);\n",[109,63313,63314,63341,63367],{"__ignoreMap":107},[112,63315,63316,63318,63320,63322,63325,63327,63329,63332,63334,63337,63339],{"class":114,"line":115},[112,63317,26884],{"class":236},[112,63319,1512],{"class":118},[112,63321,456],{"class":236},[112,63323,63324],{"class":122},"`Input tokens: ${",[112,63326,17690],{"class":236},[112,63328,634],{"class":122},[112,63330,63331],{"class":236},"usage",[112,63333,634],{"class":122},[112,63335,63336],{"class":236},"input_tokens",[112,63338,640],{"class":122},[112,63340,464],{"class":236},[112,63342,63343,63345,63347,63349,63352,63354,63356,63358,63360,63363,63365],{"class":114,"line":126},[112,63344,26884],{"class":236},[112,63346,1512],{"class":118},[112,63348,456],{"class":236},[112,63350,63351],{"class":122},"`Output tokens: ${",[112,63353,17690],{"class":236},[112,63355,634],{"class":122},[112,63357,63331],{"class":236},[112,63359,634],{"class":122},[112,63361,63362],{"class":236},"output_tokens",[112,63364,640],{"class":122},[112,63366,464],{"class":236},[112,63368,63369,63371,63373,63375,63378,63380,63382,63384,63386,63389,63391,63394,63396],{"class":114,"line":135},[112,63370,26884],{"class":236},[112,63372,1512],{"class":118},[112,63374,456],{"class":236},[112,63376,63377],{"class":122},"`Tool search requests: ${",[112,63379,17690],{"class":236},[112,63381,634],{"class":122},[112,63383,63331],{"class":236},[112,63385,634],{"class":122},[112,63387,63388],{"class":236},"server_tool_use",[112,63390,27643],{"class":122},[112,63392,63393],{"class":236},"tool_search_requests",[112,63395,640],{"class":122},[112,63397,464],{"class":236},[35,63399,63401],{"id":63400},"_5-combine-with-prompt-caching","5. Combine with Prompt Caching",[19,63403,41287,63404,63409],{},[1614,63405,63408],{"href":63406,"rel":63407},"https://www.notion.so/guides/building_ai_applications_with_unified_and_langbase",[1618],"prompt caching"," with defer_loading for multi-turn conversations:",[102,63411,63413],{"className":220,"code":63412,"language":222,"meta":107,"style":107},"messages.push({\n    role: \"user\",\n    content: \"Now find their recent deals\",\n    cache_control: { type: \"ephemeral\" }\n});\n",[109,63414,63415,63424,63433,63443,63453],{"__ignoreMap":107},[112,63416,63417,63420,63422],{"class":114,"line":115},[112,63418,63419],{"class":236},"messages.",[112,63421,14547],{"class":118},[112,63423,363],{"class":236},[112,63425,63426,63429,63431],{"class":114,"line":126},[112,63427,63428],{"class":236},"    role: ",[112,63430,27950],{"class":122},[112,63432,288],{"class":236},[112,63434,63435,63438,63441],{"class":114,"line":135},[112,63436,63437],{"class":236},"    content: ",[112,63439,63440],{"class":122},"\"Now find their recent deals\"",[112,63442,288],{"class":236},[112,63444,63445,63448,63451],{"class":114,"line":147},[112,63446,63447],{"class":236},"    cache_control: { type: ",[112,63449,63450],{"class":122},"\"ephemeral\"",[112,63452,2398],{"class":236},[112,63454,63455],{"class":114,"line":202},[112,63456,384],{"class":236},[67,63458,63460],{"id":63459},"tool-search-limits","Tool Search Limits",[19,63462,63463],{},"Be aware of these limits:",[72,63465,63466,63472,63478,63484],{},[46,63467,63468,63471],{},[478,63469,63470],{},"Maximum tools",": 10,000 tools in your catalog",[46,63473,63474,63477],{},[478,63475,63476],{},"Search results",": Returns 3-5 most relevant tools per search",[46,63479,63480,63483],{},[478,63481,63482],{},"Pattern length",": Maximum 200 characters for regex patterns",[46,63485,63486,63489],{},[478,63487,63488],{},"Model support",": Claude Sonnet 4.5+ and Opus 4.5+ only",[67,63491,63493],{"id":63492},"when-to-use-defer-loading","When to Use Defer Loading",[19,63495,63496],{},[478,63497,63498],{},"Good use cases:",[72,63500,63501,63504,63507,63510,63513],{},[46,63502,63503],{},"20+ tools available from Unified connections",[46,63505,63506],{},"Multiple integrations (CRM + ATS + HRIS + Storage)",[46,63508,63509],{},"Building multi-tenant applications where each tenant has different integrations",[46,63511,63512],{},"Context window is getting tight with tool definitions",[46,63514,63515],{},"Tool selection accuracy is degrading",[19,63517,63518],{},[478,63519,63520],{},"When traditional tool calling might be better:",[72,63522,63523,63526,63529],{},[46,63524,63525],{},"Less than 10 tools total",[46,63527,63528],{},"All tools are frequently used in every request",[46,63530,63531],{},"Very focused single-integration use case",[67,63533,63535],{"id":63534},"real-world-example-multi-integration-assistant","Real-World Example: Multi-Integration Assistant",[19,63537,63538],{},"Here's a practical example of a customer support assistant that accesses multiple integrations:",[102,63540,63542],{"className":220,"code":63541,"language":222,"meta":107,"style":107},"async function createSupportAssistant(crm_connection_id, hris_connection_id, zendesk_connection_id) {\n    // Fetch tools from multiple Unified connections\n    const crmTools = await fetchUnifiedTools(crm_connection_id, 'crm_contact_read,crm_deal_read', { type: 'anthropic', defer_tools: 'list_crm_'});\n    const ticketingTools = await fetchUnifiedTools(zendesk_connection_id, 'ticketing_ticket_read,ticketing_ticket_write', { type: 'anthropic', defer_tools: 'list_crm_'});\n    const hrisTools = await fetchUnifiedTools(hris_connection_id, 'hris_employee_read', { type: 'anthropic', defer_tools: 'list_crm_'});\n\n    // Combine all tools with defer_loading\n    const tools = [\n        ...crmTools,\n        ...ticketingTools,\n        ...hrisTools\n    ];\n\n    // Total: 150+ tools, with all listX tools being deffered\n    return await anthropic.beta.messages.create({\n        model: \"claude-sonnet-4-5-20250929\",\n        betas: [\"advanced-tool-use-2025-11-20\"],\n        max_tokens: 4096,\n        messages: [{\n            role: \"user\",\n            content: \"Customer John Doe from Acme Corp called about ticket #12345. Show me his account info, open tickets, and any recent deals.\"\n        }],\n        tools: tools\n    });\n}\n",[109,63543,63544,63570,63575,63609,63638,63667,63671,63676,63686,63694,63701,63708,63713,63717,63722,63734,63744,63754,63764,63769,63777,63785,63790,63795,63799],{"__ignoreMap":107},[112,63545,63546,63548,63550,63553,63555,63558,63560,63563,63565,63568],{"class":114,"line":115},[112,63547,1377],{"class":229},[112,63549,509],{"class":229},[112,63551,63552],{"class":118}," createSupportAssistant",[112,63554,456],{"class":236},[112,63556,63557],{"class":517},"crm_connection_id",[112,63559,1046],{"class":236},[112,63561,63562],{"class":517},"hris_connection_id",[112,63564,1046],{"class":236},[112,63566,63567],{"class":517},"zendesk_connection_id",[112,63569,526],{"class":236},[112,63571,63572],{"class":114,"line":126},[112,63573,63574],{"class":578},"    // Fetch tools from multiple Unified connections\n",[112,63576,63577,63579,63582,63584,63586,63589,63592,63595,63598,63601,63604,63607],{"class":114,"line":135},[112,63578,1435],{"class":229},[112,63580,63581],{"class":129}," crmTools",[112,63583,354],{"class":229},[112,63585,539],{"class":229},[112,63587,63588],{"class":118}," fetchUnifiedTools",[112,63590,63591],{"class":236},"(crm_connection_id, ",[112,63593,63594],{"class":122},"'crm_contact_read,crm_deal_read'",[112,63596,63597],{"class":236},", { type: ",[112,63599,63600],{"class":122},"'anthropic'",[112,63602,63603],{"class":236},", defer_tools: ",[112,63605,63606],{"class":122},"'list_crm_'",[112,63608,384],{"class":236},[112,63610,63611,63613,63616,63618,63620,63622,63625,63628,63630,63632,63634,63636],{"class":114,"line":147},[112,63612,1435],{"class":229},[112,63614,63615],{"class":129}," ticketingTools",[112,63617,354],{"class":229},[112,63619,539],{"class":229},[112,63621,63588],{"class":118},[112,63623,63624],{"class":236},"(zendesk_connection_id, ",[112,63626,63627],{"class":122},"'ticketing_ticket_read,ticketing_ticket_write'",[112,63629,63597],{"class":236},[112,63631,63600],{"class":122},[112,63633,63603],{"class":236},[112,63635,63606],{"class":122},[112,63637,384],{"class":236},[112,63639,63640,63642,63645,63647,63649,63651,63654,63657,63659,63661,63663,63665],{"class":114,"line":202},[112,63641,1435],{"class":229},[112,63643,63644],{"class":129}," hrisTools",[112,63646,354],{"class":229},[112,63648,539],{"class":229},[112,63650,63588],{"class":118},[112,63652,63653],{"class":236},"(hris_connection_id, ",[112,63655,63656],{"class":122},"'hris_employee_read'",[112,63658,63597],{"class":236},[112,63660,63600],{"class":122},[112,63662,63603],{"class":236},[112,63664,63606],{"class":122},[112,63666,384],{"class":236},[112,63668,63669],{"class":114,"line":208},[112,63670,272],{"emptyLinePlaceholder":271},[112,63672,63673],{"class":114,"line":291},[112,63674,63675],{"class":578},"    // Combine all tools with defer_loading\n",[112,63677,63678,63680,63682,63684],{"class":114,"line":299},[112,63679,1435],{"class":229},[112,63681,27452],{"class":129},[112,63683,354],{"class":229},[112,63685,624],{"class":236},[112,63687,63688,63691],{"class":114,"line":307},[112,63689,63690],{"class":229},"        ...",[112,63692,63693],{"class":236},"crmTools,\n",[112,63695,63696,63698],{"class":114,"line":315},[112,63697,63690],{"class":229},[112,63699,63700],{"class":236},"ticketingTools,\n",[112,63702,63703,63705],{"class":114,"line":323},[112,63704,63690],{"class":229},[112,63706,63707],{"class":236},"hrisTools\n",[112,63709,63710],{"class":114,"line":329},[112,63711,63712],{"class":236},"    ];\n",[112,63714,63715],{"class":114,"line":341},[112,63716,272],{"emptyLinePlaceholder":271},[112,63718,63719],{"class":114,"line":346},[112,63720,63721],{"class":578},"    // Total: 150+ tools, with all listX tools being deffered\n",[112,63723,63724,63726,63728,63730,63732],{"class":114,"line":366},[112,63725,572],{"class":229},[112,63727,539],{"class":229},[112,63729,26731],{"class":236},[112,63731,18060],{"class":118},[112,63733,363],{"class":236},[112,63735,63736,63739,63742],{"class":114,"line":381},[112,63737,63738],{"class":236},"        model: ",[112,63740,63741],{"class":122},"\"claude-sonnet-4-5-20250929\"",[112,63743,288],{"class":236},[112,63745,63746,63749,63752],{"class":114,"line":387},[112,63747,63748],{"class":236},"        betas: [",[112,63750,63751],{"class":122},"\"advanced-tool-use-2025-11-20\"",[112,63753,3908],{"class":236},[112,63755,63756,63759,63762],{"class":114,"line":392},[112,63757,63758],{"class":236},"        max_tokens: ",[112,63760,63761],{"class":129},"4096",[112,63763,288],{"class":236},[112,63765,63766],{"class":114,"line":409},[112,63767,63768],{"class":236},"        messages: [{\n",[112,63770,63771,63773,63775],{"class":114,"line":422},[112,63772,26763],{"class":236},[112,63774,27950],{"class":122},[112,63776,288],{"class":236},[112,63778,63779,63782],{"class":114,"line":435},[112,63780,63781],{"class":236},"            content: ",[112,63783,63784],{"class":122},"\"Customer John Doe from Acme Corp called about ticket #12345. Show me his account info, open tickets, and any recent deals.\"\n",[112,63786,63787],{"class":114,"line":440},[112,63788,63789],{"class":236},"        }],\n",[112,63791,63792],{"class":114,"line":4949},[112,63793,63794],{"class":236},"        tools: tools\n",[112,63796,63797],{"class":114,"line":4960},[112,63798,15149],{"class":236},[112,63800,63801],{"class":114,"line":4972},[112,63802,584],{"class":236},[67,63804,13513],{"id":13512},[72,63806,63807,63814,63821,63828,63835],{},[46,63808,63809],{},[1614,63810,63813],{"href":63811,"rel":63812},"https://docs.unified.to/mcp/overview",[1618],"Unified MCP Server Overview",[46,63815,63816],{},[1614,63817,63820],{"href":63818,"rel":63819},"https://docs.unified.to/mcp/installation",[1618],"MCP Installation & Usage",[46,63822,63823],{},[1614,63824,63827],{"href":63825,"rel":63826},"https://docs.unified.to/mcp/server-options",[1618],"MCP Server Options",[46,63829,63830],{},[1614,63831,63834],{"href":63832,"rel":63833},"https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool",[1618],"Anthropic Tool Search Documentation",[46,63836,63837],{},[1614,63838,63840],{"href":62997,"rel":63839},[1618],"Anthropic MCP Integration Guide",[67,63842,63844],{"id":63843},"tldr","TLDR",[19,63846,62910,63847,63849],{},[109,63848,62849],{}," feature is a game-changer for building AI applications with Unified's MCP server. By the LLM API dynamically loading tools on-demand, you can:",[72,63851,63852,63858,63864,63870],{},[46,63853,63854,63857],{},[478,63855,63856],{},"Scale to hundreds of tools"," across multiple integrations",[46,63859,63860,63863],{},[478,63861,63862],{},"Reduce context usage"," by 80-90%",[46,63865,63866,63869],{},[478,63867,63868],{},"Improve tool selection accuracy"," significantly",[46,63871,63872,63875],{},[478,63873,63874],{},"Build more capable AI assistants"," that access diverse data sources",[19,63877,63878],{},"Start by adding the tool search tool and marking your Unified MCP tools as deferred. Monitor your token usage and tool selection accuracy to see the immediate benefits.",[19,63880,63881],{},"The combination of Unified's extensive integration network and Anthropic's intelligent tool search opens up possibilities for building truly comprehensive AI agents that can work across your entire SaaS ecosystem.",[1558,63883,63884],{},"html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}",{"title":107,"searchDepth":126,"depth":126,"links":63886},[63887,63888,63892,63893,63900,63901,63902,63903,63904],{"id":62885,"depth":126,"text":62886},{"id":62906,"depth":126,"text":62907,"children":63889},[63890,63891],{"id":62916,"depth":135,"text":62917},{"id":45638,"depth":135,"text":62958},{"id":62987,"depth":126,"text":62988},{"id":10074,"depth":126,"text":63242,"children":63894},[63895,63896,63897,63898,63899],{"id":63245,"depth":135,"text":63246},{"id":63252,"depth":135,"text":63253},{"id":63287,"depth":135,"text":63288},{"id":63304,"depth":135,"text":63305},{"id":63400,"depth":135,"text":63401},{"id":63459,"depth":126,"text":63460},{"id":63492,"depth":126,"text":63493},{"id":63534,"depth":126,"text":63535},{"id":13512,"depth":126,"text":13513},{"id":63843,"depth":126,"text":63844},"Learn how to use Anthropic's `defer_loading` tool search features with Unified's MCP server to efficiently manage hundreds of tools while maintaining high...",{"img":63907,"date":63908,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/scaling_mcp_tools_with_anthropic_defer_loading-icon.png","2025-12-25T18:46:00.000Z","/guides/scaling_mcp_tools_with_anthropic_defer_loading",{"title":62831,"description":63905},"guides/scaling_mcp_tools_with_anthropic_defer_loading","AlJfrVLRF_FWW7A_DwuJpmT99aDzPDmImQC_tkVbC0k",{"id":63914,"title":63915,"body":63916,"description":64200,"extension":1576,"meta":64201,"navigation":271,"path":64204,"seo":64205,"stem":64206,"__hash__":64207},"guides/guides/set_environments_for_your_unified_workspace.md","Set Environments for your Unified.to Workspace",{"type":9,"value":63917,"toc":64191},[63918,63921,63923,63928,63931,63940,63944,63947,63950,63956,63960,63986,63990,64010,64014,64017,64022,64029,64032,64037,64044,64047,64052,64059,64062,64067,64074,64077,64081,64084,64089,64105,64110,64144,64148,64151,64171,64174,64178,64181,64184],[12,63919,63915],{"id":63920},"set-environments-for-your-unifiedto-workspace",[16,63922],{},[19,63924,63925],{},[22,63926,63927],{},"June 7, 2023",[19,63929,63930],{},"We're eager to share the release of environments, a new feature that makes it easier to test and customize your integrations before releasing them to production. For example, you can create environments for staging and production, which gives you more control over testing integrations with our Unified API.",[19,63932,63933],{},[1614,63934,63937],{"href":63935,"rel":63936},"https://app.unified.to/?utm_source=blog&utm_medium=blog&utm_campaign=environments&utm_content=environments_blog",[1618],[478,63938,63939],{},"Try it now",[67,63941,63943],{"id":63942},"what-is-an-environment","What is an environment?",[19,63945,63946],{},"Environments are configurable spaces that allow you to specify different integration credentials for different circumstances. Determine distinct access and configuration rules for various scenarios, such as production, staging, and testing, which gives you more flexibility and control over managing your release processes.",[19,63948,63949],{},"Environments can be added under any plan in your Unified.to account's Workspace.",[19,63951,63952],{},[1603,63953],{"alt":63954,"src":63955},"UnifiedAPI_Environments.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-0.png",[67,63957,63959],{"id":63958},"capabilities-of-environments","Capabilities of environments",[72,63961,63962,63968,63974,63980],{},[46,63963,63964,63967],{},[478,63965,63966],{},"Integration testing:"," Before releasing integrations to production, you can now test them in a different environment.",[46,63969,63970,63973],{},[478,63971,63972],{},"Multiple environments:"," You can set up multiple environments such as production, staging, and others personalized to you and your team's needs.",[46,63975,63976,63979],{},[478,63977,63978],{},"Environment-specific integrations:"," You can now decide which integrations are active in each environment.",[46,63981,63982,63985],{},[478,63983,63984],{},"Application credential assignment:"," Choose which application credentials to use for each integration in each environment.",[67,63987,63989],{"id":63988},"benefits-of-environments","Benefits of environments",[72,63991,63992,63998,64004],{},[46,63993,63994,63997],{},[478,63995,63996],{},"Greater flexibility:"," You can tailor your integrations to meet the unique needs of each environment including client specifications.",[46,63999,64000,64003],{},[478,64001,64002],{},"Reduced errors:"," Testing integrations in a staging environment before moving them to production helps minimize mistakes and unexpected errors.",[46,64005,64006,64009],{},[478,64007,64008],{},"Increased productivity:"," This feature streamlines the management of your workspace, reducing time spent on setup and adjustments.",[67,64011,64013],{"id":64012},"when-to-use-multiple-environments","When to use multiple environments",[19,64015,64016],{},"Set multiple environments regardless of what plan you're on for different scenarios:",[19,64018,64019],{},[478,64020,64021],{},"1. Localhost",[19,64023,64024],{},[22,64025,64026],{},[478,64027,64028],{},"Create a sandbox environment without disrupting your team's workflow or end-user experience",[19,64030,64031],{},"Example: Suppose Laura, a developer, is working on integrating a new batch of HR services. She creates her own personal authentication environment within Unified.to, complete with application credentials specific to her environment. This allows Laura to experiment freely without affecting her app's live features or her fellow developers' work.",[19,64033,64034],{},[478,64035,64036],{},"2. Testing or QA",[19,64038,64039],{},[22,64040,64041],{},[478,64042,64043],{},"Try out new integrations and run tests before releasing them to production",[19,64045,64046],{},"Example: Once Laura has completed her initial development work, she simply copies the credentials to the testing environment. This environment has its own set of credentials and often uses mocked or dummy data for testing purposes. In this stage, Laura and her team run a battery of tests to ensure the new HR integrations work as expected and don't disrupt other functionalities within the app.",[19,64048,64049],{},[478,64050,64051],{},"3. Staging",[19,64053,64054],{},[22,64055,64056],{},[478,64057,64058],{},"Mirror your production environment to finely-tune performance and perform final tests",[19,64060,64061],{},"Example: After the new HR integrations pass all tests in the testing environment, it's promoted to the staging environment. This environment is a mirror image of the production environment, complete with the same application credentials used in production. The HR integrations are tested under conditions that closely mimic the live application. This final testing phase ensures the new batch of integrations are ready for deployment in the production environment.",[19,64063,64064],{},[478,64065,64066],{},"4. Production",[19,64068,64069],{},[22,64070,64071],{},[478,64072,64073],{},"Your live environment where your integrations run and are available to end-users",[19,64075,64076],{},"Example: This is the live environment where the application operates, interacts with real data, and serves actual users. It uses production application credentials. With the successful deployment of the new HR integrations, all users of the app can now benefit from the new integrations Laura has been working on.",[67,64078,64080],{"id":64079},"how-to-set-new-environments","How to set new environments",[19,64082,64083],{},"Implement this new feature in seconds. Follow these steps:",[19,64085,64086],{},[478,64087,64088],{},"Setting up Environments",[43,64090,64091,64097,64102],{},[46,64092,64093,64094],{},"Log in to or create a ",[1614,64095,47434],{"href":63935,"rel":64096},[1618],[46,64098,11822,64099,64101],{},[478,64100,46064],{}," and insert the name of your new environment, (e.g., 'Staging') and press enter",[46,64103,64104],{},"Once entered, your environment can be used for configuring individual integrations and generating an Embedded Directory",[19,64106,64107],{},[478,64108,64109],{},"Configuring Integrations",[43,64111,64112,64123,64132,64141],{},[46,64113,9735,64114,64116,64117,64119],{},[478,64115,9700],{}," and click ACTIVATE on any integration, for example, Workday",[17180,64118],{},[1603,64120],{"alt":64121,"src":64122},"CleanShot_2023-06-08_at_09.12.242x.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-1.png",[46,64124,64125,64126,64128],{},"From the dropdown menu, select the environment where you to want to add credentials, such OAuth Client ID and Secret",[17180,64127],{},[1603,64129],{"alt":64130,"src":64131},"Workday_Environment_Selection.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-2.png",[46,64133,64134,64135,64137],{},"Input your credentials for Workday for the selected environment and click ACTIVATE",[17180,64136],{},[1603,64138],{"alt":64139,"src":64140},"Note: If you are activating an integration that supports API key and doesn't require OAuth credentials, then you can just click ACTIVATE.","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-3.png",[46,64142,64143],{},"Repeat for any integration and environment",[67,64145,64147],{"id":64146},"embed-directory","Embed Directory",[19,64149,64150],{},"After enabling integrations for a specific environment, you can generate an Embedded Directory for that environment.",[43,64152,64153,64162],{},[46,64154,64155,64156,64158],{},"Select the desired authentication environment from the dropdown menu.",[17180,64157],{},[1603,64159],{"alt":64160,"src":64161},"Embedded_Directory_Environment.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-4.png",[46,64163,64164,64165,64167],{},"This will generate a script with a new environment parameter for you.",[17180,64166],{},[1603,64168],{"alt":64169,"src":64170},"Directory_Script.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-5.png",[19,64172,64173],{},"If you're using our API to pull a list of active integrations for your directory, you can pass the environment query parameter to retrieve the correct integrations.",[67,64175,64177],{"id":64176},"building-the-ultimate-unified-api-solution-for-integrations","Building the ultimate Unified API solution for integrations",[19,64179,64180],{},"This new authentication environment feature is just one of the many ways we're making Unified.to work better for developers who want to build API-first integrations with industry-leading HR, Sales, Marketing, and Support apps. We're excited for you to try Authentication Environments and see the difference it makes in managing your integrations pre-launch.",[19,64182,64183],{},"Our team is here to support you every step of the way. Enjoy exploring Unified.to and let us know if you need a hand.",[19,64185,64186,64187,634],{},"You can try setting Unified.to's Authentication Environments at ",[1614,64188,64190],{"href":63935,"rel":64189},[1618],"unified.to/get-started",{"title":107,"searchDepth":126,"depth":126,"links":64192},[64193,64194,64195,64196,64197,64198,64199],{"id":63942,"depth":126,"text":63943},{"id":63958,"depth":126,"text":63959},{"id":63988,"depth":126,"text":63989},{"id":64012,"depth":126,"text":64013},{"id":64079,"depth":126,"text":64080},{"id":64146,"depth":126,"text":64147},{"id":64176,"depth":126,"text":64177},"We're eager to share the release of environments, a new feature that makes it easier to test and customize your integrations before releasing them to...",{"img":64202,"date":64203,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-icon.png","2023-06-07T00:00:00.000Z","/guides/set_environments_for_your_unified_workspace",{"title":63915,"description":64200},"guides/set_environments_for_your_unified_workspace","4EfsUfsTTXZU73ILXkRDxuUKWRQILNg-k3DJJ4a7WOk",{"id":64209,"title":64210,"body":64211,"description":64452,"extension":1576,"meta":64453,"navigation":271,"path":64456,"seo":64457,"stem":64458,"__hash__":64459},"guides/guides/setting_up_oauth_2_credentials_for_greenhouse_apis.md","Setting up OAuth 2 Credentials for Greenhouse's APIs",{"type":9,"value":64212,"toc":64446},[64213,64216,64218,64223,64227,64234,64266,64270,64328,64332,64336,64339,64366,64370,64373,64387,64390,64394,64397,64409,64414,64417,64441],[12,64214,64210],{"id":64215},"setting-up-oauth-2-credentials-for-greenhouses-apis",[16,64217],{},[19,64219,64220],{},[22,64221,64222],{},"May 27, 2024",[67,64224,64226],{"id":64225},"important-read-this-first","Important — Read this first!",[19,64228,64229,64230,64233],{},"Unified.to has ",[22,64231,64232],{},"two"," integrations name with the name 'Greenhouse':",[43,64235,64236,64253],{},[46,64237,64238,64239,64241,64242,2251,64249,64252],{},"The first one that appears in the ",[478,64240,9700],{}," page is for Greenhouse's ",[1614,64243,64246],{"href":64244,"rel":64245},"https://support.greenhouse.io/hc/en-us/articles/360029266032-Harvest-API-overview",[1618],[478,64247,64248],{},"Harvest API",[478,64250,64251],{},"(v3)",", which  uses OAuth2 code-flow to authorize your application.  For most of the use-cases, you should use this integration.",[46,64254,64255,64256,64241,64258,64265],{},"The second one that appears in the  ",[478,64257,9700],{},[1614,64259,64262],{"href":64260,"rel":64261},"https://developers.greenhouse.io/candidate-ingestion.html",[1618],[478,64263,64264],{},"Candidate Ingestion API",", which uses OAuth 2 client-credentials-flow to authorize your application.",[12,64267,64269],{"id":64268},"greenhouse-harvest-api-v3","Greenhouse Harvest API (v3)",[43,64271,64272,64286,64289,64301,64325],{},[46,64273,64274,64279,64280,2251,64283],{},[1614,64275,64278],{"href":64276,"rel":64277},"https://www.greenhouse.com/integration-partner#apply-now",[1618],"Integration request form"," should be submitted by every new company. ",[22,64281,64282],{},"Applications are reviewed by Greenhouse on the first Monday of every month.",[478,64284,64285],{},"If a company is already an official Greenhouse partner with a signed agreement, they may proceed directly to step 3.",[46,64287,64288],{},"After completing a review, Greenhouse will share API agreement with company",[46,64290,64291,64292,64296,64297,64300],{},"Once the agreement is signed, the company should follow the steps ",[1614,64293,17258],{"href":64294,"rel":64295},"https://harvestdocs.greenhouse.io/docs/harvest-partner-oauth",[1618]," to have a client application created for their integration. They will provide Greenhouse with a redirect_uri (",[1614,64298,34368],{"href":34368,"rel":64299},[1618],") that will be attached to their specific integration's client application. Greenhouse will provide the client credentials (client_id and client_secret)",[46,64302,64303,64304,64309,64310],{},"The company will input their (2) credentials in ",[1614,64305,64308],{"href":64306,"rel":64307},"https://app.unified.to/integrations/greenhousehttps://app.unified.to/integrations/greenhouse",[1618],"https://app.unified.to/integrations/greenhouse",". Unified will handle all authorization:\n",[43,64311,64312,64319,64322],{},[46,64313,64314,64315,610],{},"Access authorization, token management, refreshes and storage (",[1614,64316,64318],{"href":64294,"rel":64317},[1618],"instructions found here",[46,64320,64321],{},"Proxy requests on behalf of the originating partner to harvest v3 APIs",[46,64323,64324],{},"Secure access schemes to proxy APIs from originating partner to UAPI provider that ensure no cross contamination",[46,64326,64327],{},"The company will complete the remaining onboarding steps with Greenhouse.",[12,64329,64331],{"id":64330},"greenhouse-ingestion-api","Greenhouse Ingestion API",[67,64333,64335],{"id":64334},"submit-information-about-your-application-to-greenhouse","Submit information about your application to Greenhouse",[19,64337,64338],{},"Before you can make use of Unified.to's Embedded Authorization component to let your users authorize Greenhouse to access their accounts, you will need to provide Greenhouse with the following:",[43,64340,64341,64347,64353,64360],{},[46,64342,64343,64346],{},[478,64344,64345],{},"Application Name",": The name of your application as it would appear in Greenhouse.",[46,64348,64349,64352],{},[478,64350,64351],{},"Application URL",": The URL of your application.",[46,64354,64355,64357,64358],{},[478,64356,37124],{},": After the end user authorizes your application to access their account, Greenhouse will redirect them to this URL. Provide this one:\n",[109,64359,34368],{},[46,64361,64362,64365],{},[478,64363,64364],{},"Logo Image",": A 128 by 128 pixel image that Greenhouse will include in their permissions modal.",[67,64367,64369],{"id":64368},"receive-the-consumer-key-and-consumer-secret-provided-by-greenhouse","Receive the Consumer Key and Consumer Secret provided by Greenhouse",[19,64371,64372],{},"When Greenhouse receives the information listed above, they will provide a set of values including these two:",[72,64374,64375,64381],{},[46,64376,9638,64377,64380],{},[478,64378,64379],{},"consumer key",", which uniquely identifies your application",[46,64382,9638,64383,64386],{},[478,64384,64385],{},"consumer secret",", which acts as proof of your application's identity",[19,64388,64389],{},"As its name implies, the consumer secret is confidential. For security purposes, Greenhouse will encrypt the consumer secret before emailing it to you (they'll explain how to decrypt it).",[67,64391,64393],{"id":64392},"activate-greenhouse-in-unifiedto","Activate Greenhouse in Unified.to",[19,64395,64396],{},"With your application registered with Greenhouse and the OAuth 2 credentials in hand, you can now activate the Greenhouse integration in Unified.to.",[19,64398,64399,64400,64405,64406,64408],{},"In Unified.to, go to the ",[1614,64401,64403],{"href":9741,"rel":64402},[1618],[478,64404,40572],{}," page, find the Greenhouse Ingestion API item (and ",[22,64407,25455],{}," the Greenhouse Harvest API one) and click on it:",[19,64410,64411],{},[1603,64412],{"alt":11593,"src":64413},"https://s3.us-east-2.amazonaws.com/unified-article-images/setting_up_oauth_2_credentials_for_greenhouse_apis-0.png",[19,64415,64416],{},"On the page that appears, do the following:",[43,64418,64419,64423,64430,64436],{},[46,64420,12267,64421,634],{},[478,64422,35252],{},[46,64424,64425,64426,64429],{},"Enter the consumer key value into the ",[478,64427,64428],{},"OAuth 2 Client ID"," text field.",[46,64431,64432,64433,64429],{},"Enter the consumer secret value into the ",[478,64434,64435],{},"OAuth 2 Client Secret",[46,64437,32017,64438,64440],{},[478,64439,9760],{}," button to save the changes and activate the Greenhouse integration.",[19,64442,64443],{},[1603,64444],{"alt":11593,"src":64445},"https://s3.us-east-2.amazonaws.com/unified-article-images/setting_up_oauth_2_credentials_for_greenhouse_apis-1.png",{"title":107,"searchDepth":126,"depth":126,"links":64447},[64448,64449,64450,64451],{"id":64225,"depth":126,"text":64226},{"id":64334,"depth":126,"text":64335},{"id":64368,"depth":126,"text":64369},{"id":64392,"depth":126,"text":64393},"Unified.to has two integrations name with the name 'Greenhouse',",{"img":64454,"date":64455,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/setting_up_oauth_2_credentials_for_greenhouse_apis-icon.png","2024-05-27T00:00:00.000Z","/guides/setting_up_oauth_2_credentials_for_greenhouse_apis",{"title":64210,"description":64452},"guides/setting_up_oauth_2_credentials_for_greenhouse_apis","3HWeGKNxIbpx6ylihEJrHaCLJVPii3Z1Ha697qonies",{"id":64461,"title":64462,"body":64463,"description":64786,"extension":1576,"meta":64787,"navigation":271,"path":64790,"seo":64791,"stem":64792,"__hash__":64793},"guides/guides/understanding_oauth2_authorization_flows.md","Understanding OAuth2 Authorization flows",{"type":9,"value":64464,"toc":64780},[64465,64468,64470,64475,64483,64501,64509,64511,64515,64521,64526,64564,64574,64591,64594,64597,64602,64612,64614,64618,64626,64633,64644,64647,64652,64665,64669,64674,64678,64692,64695,64700,64708,64710,64714,64734,64740,64746,64749,64759,64764,64770,64772],[12,64466,64462],{"id":64467},"understanding-oauth2-authorization-flows",[16,64469],{},[19,64471,64472],{},[22,64473,64474],{},"October 17, 2025",[19,64476,64477,64482],{},[1614,64478,64481],{"href":64479,"rel":64480},"https://oauth.net/2/",[1618],"OAuth 2.0 ","is an industry‑standard protocol for authorization that lets applications request limited access to a user's data on an API service without exposing passwords. This overview highlights the core flows that Unified supports.  OAuth2 has 2 versions, and v2 has several flows.  Overall, Unified seamlessly supports over 70 variants of just OAuth2.",[19,64484,64485,64486,64490,64491,64496],{},"We will not bother with OAuth v1 as it was formally obsoleted when the ",[1614,64487,64489],{"href":64479,"rel":64488},[1618],"OAuth 2.0"," spec was published as RFC 6749 in October 2012. The RFC explicitly states it 'replaces and obsoletes' OAuth 1.0 (RFC 5849).",[1614,64492,64495],{"href":64493,"rel":64494},"https://rfc-editor.org/info/rfc6749",[1618],"[1]",[1614,64497,64500],{"href":64498,"rel":64499},"https://rfc-editor.org/info/rfc5849",[1618],"[2]",[19,64502,64503,64508],{},[1614,64504,64507],{"href":64505,"rel":64506},"https://oauth.net/2.1/",[1618],"OAuth 2.1"," is still in-progress (as of Oct 2025) and will be backwards-compatible to v2.0, but make the flows more restricted to add additional security.",[16,64510],{},[67,64512,64514],{"id":64513},"oauth2-code-flow","OAuth2 Code Flow",[19,64516,64517,64518,64520],{},"OAuth2 ",[109,64519,109],{}," flow is designed for applications that need to access a user's data in a third-party service (e.g., Google, Salesforce, HubSpot) with the user's explicit consent. It's the standard for options you see all over the Internet like 'Sign in with Google' and gain delegated access.  This flow can be used to grant access to data and/or to retrieve the identity of the authenticated user.",[19,64522,64523],{},[478,64524,64525],{},"How it works:",[72,64527,64528,64549,64552,64555,64558],{},[46,64529,64530,64531,64534,64535,64537,64538,64541,64542,16564,64545,64548],{},"Your app redirects the user to the provider's authorization page.  This URL contains your app's ",[109,64532,64533],{},"client ID"," from that provider, plus provider-specific permission ",[109,64536,33719],{}," and a ",[109,64539,64540],{},"redirect URL",".  It can also contain additional information such as ",[109,64543,64544],{},"state",[109,64546,64547],{},"PKCE challenge",", and many more provider-specific parameters.",[46,64550,64551],{},"The end-user logs in to that provider (if not already logged in) and is shown what permissions your app is requesting.  They can then approve or reject that access request.",[46,64553,64554],{},"If approved, the provider redirects back to your app with a temporary code.",[46,64556,64557],{},"Your backend exchanges the code for an access token (and optionally refresh token).  This step uses both the client ID and client secret, essentially securing the transaction.  The access token will have an expiry which will require the use of the refresh token to obtain new access tokens.",[46,64559,64560,64561,64563],{},"Your app uses the access token in the ",[109,64562,12264],{}," header to call that provider's APIs on behalf of the user.",[19,64565,64566,2251,64568,64573],{},[478,64567,1640],{},[1614,64569,64572],{"href":64570,"rel":64571},"https://docs.unified.to/unified/integration/Authorize_new_connection",[1618],"handles all aspects of this OAuth2 flow",";",[72,64575,64576,64579,64582,64585,64588],{},[46,64577,64578],{},"creating the authorizing URL correctly",[46,64580,64581],{},"unifying permission scopes (eg. crm_contact_read, accounting_invoice_write, …)",[46,64583,64584],{},"exchanging codes for access tokens",[46,64586,64587],{},"automatically refreshing access tokens (and optionally refresh tokens)",[46,64589,64590],{},"calling the end API with the access token in the correct header and format",[19,64592,64593],{},"This happens with our pre-built components, or directly through our Authorization API.",[19,64595,64596],{},"Our customers just input their application's OAuth2 client ID and client Secret obtained once from the provider.  Unified also provides instructions on how to obtain those OAuth credentials.",[19,64598,64599],{},[1603,64600],{"alt":13589,"src":64601},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-0.png",[19,64603,64604,64605,64608,64609,64611],{},"Currently, ",[1614,64606,1640],{"href":1638,"rel":64607},[1618]," supports 176 integrations that support OAuth2 ",[109,64610,109],{}," flow.",[16,64613],{},[67,64615,64617],{"id":64616},"oauth2-openid-connect-oidc-flow","OAuth2 OpenID Connect (OIDC) Flow",[19,64619,2288,64620,64625],{},[1614,64621,64624],{"href":64622,"rel":64623},"https://openid.net/developers/how-connect-works/",[1618],"OAuth2 OpenID Connect"," flow is very similar to OAuth2 code flow, except that it is only used for user authentication.",[19,64627,64628,64629,64632],{},"It differs from the ",[109,64630,64631],{},"code flow"," with not supporting long-servicing access tokens and refresh tokens, since it is meant to be an instant  identity verification service.",[19,64634,64635,64636,64639,64640,64643],{},"It will either return an ",[109,64637,64638],{},"id_token"," that is a JWT-encoded object contained the verified user identity, such as a name and email. Or it will support a ",[109,64641,64642],{},"/userinfo"," API endpoint to obtain the verified user identity.",[19,64645,64646],{},"When you see a 'Sign in with Google' button, that is usually an OpenID Connect flow.",[19,64648,64649],{},[1603,64650],{"alt":13589,"src":64651},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-1.png",[19,64653,64654,2251,64656,64661,64662,12857],{},[478,64655,1640],{},[1614,64657,64660],{"href":64658,"rel":64659},"https://docs.unified.to/auth/login/Sign_in_a_user",[1618],"hides this complexity in our Unified Authentication API",", supporting OIDC along with providers that only support OAuth2 code flow with non-standard ",[109,64663,64664],{},"User Info",[67,64666,64668],{"id":64667},"oauth2-client-credentials-flow","OAuth2 Client Credentials Flow",[19,64670,64517,64671,64673],{},[109,64672,12655],{}," flow is for server-to-server (machine-to-machine) authentication. No user is involved; your backend service authenticates as itself to access APIs without the involvement of a human.  To access a end-user's data, they have to obtain a client ID and client secret from their provider and give it to your application.",[19,64675,64676],{},[478,64677,64525],{},[72,64679,64680,64683,64686,64689],{},[46,64681,64682],{},"Your end-user generates an OAuth2 client ID and client secret in their provider/application and gives it to your application.  They usually will set what permissions they are willing to grant to those credentials.",[46,64684,64685],{},"Your backend sends the client ID and secret to the provider's token endpoint.",[46,64687,64688],{},"The provider returns an access token.",[46,64690,64691],{},"Your backend uses the token to call APIs.",[19,64693,64694],{},"With Unified.to, your end-user will be asked to fill out these credentials, plus any other required credentials to access that integration's API.",[19,64696,64697],{},[1603,64698],{"alt":13589,"src":64699},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-2.png",[19,64701,64604,64702,64705,64706,64611],{},[1614,64703,1640],{"href":1638,"rel":64704},[1618]," supports 29 integrations that support OAuth2 ",[109,64707,12602],{},[16,64709],{},[67,64711,64713],{"id":64712},"api-token-key-username-password-authentication","API Token / Key / Username & Password Authentication",[19,64715,64716,64717,16564,64720,64723,64724,64727,64728,64733],{},"Additionally, APIs can also be authenticated with a ",[109,64718,64719],{},"API key",[109,64721,64722],{},"API token"," , or even a ",[109,64725,64726],{},"username and password"," . The keys and tokens consist of either random characters or an encoded ",[1614,64729,64732],{"href":64730,"rel":64731},"https://www.jwt.io/",[1618],"JWT"," (JSON web token).",[19,64735,64736,64737,64739],{},"They can be sent in the ",[109,64738,12264],{}," header, in a custom header or in the URL query as a parameter.",[19,64741,64742,64743,64745],{},"If instead of an API Key, an API uses username and password for authentication, that combination is sent in the ",[109,64744,12264],{}," header but base64-encoded as 'username:password'.",[19,64747,64748],{},"Since these values are sent in the clear for an API request, they should only be sent by a backend as they would be leaked to the end-user if used in a browser.",[19,64750,64751,64754,64755,634],{},[1614,64752,1640],{"href":1638,"rel":64753},[1618]," can ask the end-user for any number of API keys/tokens and additional required API credentials.  Optionally, our customers can request this information from their end-users and ",[1614,64756,64758],{"href":39770,"rel":64757},[1618],"create a connection manually",[19,64760,64761],{},[1603,64762],{"alt":13589,"src":64763},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-3.png",[19,64765,64604,64766,64769],{},[1614,64767,1640],{"href":1638,"rel":64768},[1618]," supports 226 integrations that support API keys/tokens.",[16,64771],{},[19,64773,64774,64775,25059],{},"If you are interested in reading about more complexities with OAuth2, read our blog post about '",[1614,64776,64779],{"href":64777,"rel":64778},"https://unified.to/blog/how_we_normalize_oauth_across_280_apis_at_unified",[1618],"How we normalize Oauth across all of our API integrations",{"title":107,"searchDepth":126,"depth":126,"links":64781},[64782,64783,64784,64785],{"id":64513,"depth":126,"text":64514},{"id":64616,"depth":126,"text":64617},{"id":64667,"depth":126,"text":64668},{"id":64712,"depth":126,"text":64713},"OAuth 2.0 is an industry‑standard protocol for authorization that lets applications request limited access to a user's data on an API service without exposing...",{"img":64788,"date":64789,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-icon.png","2025-10-17T00:00:00.000Z","/guides/understanding_oauth2_authorization_flows",{"title":64462,"description":64786},"guides/understanding_oauth2_authorization_flows","xKTLIXXuKkW3v3JvBx3hBkPdaIiskTny1tl6RRiOSJ4",{"id":64795,"title":64796,"body":64797,"description":65919,"extension":1576,"meta":65920,"navigation":271,"path":65923,"seo":65924,"stem":65925,"__hash__":65926},"guides/guides/unified_assessment_api_embed_assessments_inside_ats_platforms.md","Unified Assessment API: Embed Assessments Inside ATS Platforms",{"type":9,"value":64798,"toc":65883},[64799,64802,64804,64809,64812,64818,64822,64825,64832,64836,64839,64843,64848,64856,64861,64869,64874,64882,64885,64889,64892,64895,64898,64901,64905,64925,64928,64932,64935,64946,64953,64959,64962,64976,64980,64997,65001,65004,65007,65021,65027,65033,65036,65047,65050,65053,65056,65060,65065,65068,65071,65074,65097,65100,65103,65106,65110,65113,65126,65129,65137,65140,65144,65158,65162,65176,65180,65183,65201,65204,65207,65210,65212,65216,65219,65230,65239,65244,65287,65291,65294,65298,65301,65316,65319,65323,65326,65340,65343,65347,65350,65374,65377,65383,65386,65437,65441,65445,65448,65480,65484,65487,65495,65499,65506,65672,65676,65679,65692,65697,65819,65822,65824,65827,65856,65860,65868,65871,65874,65877,65880],[12,64800,64796],{"id":64801},"unified-assessment-api-embed-assessments-inside-ats-platforms",[16,64803],{},[19,64805,64806],{},[22,64807,64808],{},"February 9, 2026",[19,64810,64811],{},"Most assessment integrations rely on application status changes or external tools. Recruiters switch systems, and providers handle fragmented integration logic. Some ATS platforms now support embedded assessment listings, where recruiters select and order assessments directly inside the ATS.",[19,64813,64814,64815],{},"Unlike traditional integrations that rely on polling or status changes, the Assessment API enables ",[478,64816,64817],{},"real-time, recruiter-initiated assessment requests executed directly inside ATS platforms.",[67,64819,64821],{"id":64820},"what-is-an-assessment-api","What is an Assessment API?",[19,64823,64824],{},"An assessment API allows assessment providers to integrate directly into ATS platforms so recruiters can request candidate assessments without leaving the ATS. Instead of triggering assessments based on status changes, recruiters select assessment packages inside the hiring process, and the request is routed to the provider in real time.",[19,64826,64827,64828,64831],{},"The Assessment API supports both ",[478,64829,64830],{},"embedded ATS integrations and"," including package management, order handling, and result submission.",[67,64833,64835],{"id":64834},"why-ats-native-assessment-integrations-matter","Why ATS-native assessment integrations matter",[19,64837,64838],{},"Embedded assessment integrations increase completion rates and reduce friction because recruiters take action at the point of decision. There is no context switching, and results are written back to the system where hiring decisions are made.",[67,64840,64842],{"id":64841},"three-ways-to-integrate-assessments-with-unified","Three ways to integrate assessments with Unified",[19,64844,64845],{},[478,64846,64847],{},"1. Embedded (Assessment API)",[72,64849,64850,64853],{},[46,64851,64852],{},"Recruiter selects assessment inside ATS",[46,64854,64855],{},"Best UX, requires ATS support",[19,64857,64858],{},[478,64859,64860],{},"2. Triggered (ATS API)",[72,64862,64863,64866],{},[46,64864,64865],{},"Trigger on status change",[46,64867,64868],{},"Works across all ATS",[19,64870,64871],{},[478,64872,64873],{},"3. Verification-style (Verification API)",[72,64875,64876,64879],{},[46,64877,64878],{},"ATS/HRIS calls provider directly",[46,64880,64881],{},"No marketplace required",[19,64883,64884],{},"Most assessment providers use a combination of all three to balance coverage and user experience.",[67,64886,64888],{"id":64887},"unified-assessment-api","Unified Assessment API",[19,64890,64891],{},"The Unified Assessment API allows assessment and background check providers to integrate directly with Applicant Tracking Systems (ATS) platforms that support embedded assessment listings.",[19,64893,64894],{},"This API enables recruiters to request assessments for candidates directly from within their ATS. The recruiter does not need to log into a separate assessment platform or use a separate system.",[19,64896,64897],{},"Instead, the assessment package is selected inside the ATS, and the request is routed to your platform through Unified.",[19,64899,64900],{},"This is different from triggering assessments based on status changes. It is a recruiter-initiated flow inside the ATS itself.",[35,64902,64904],{"id":64903},"core-objects-in-the-assessment-api","Core objects in the Assessment API",[72,64906,64907,64913,64919],{},[46,64908,64909,64912],{},[478,64910,64911],{},"Packages",": define assessment offerings, metadata, scoring, and configuration",[46,64914,64915,64918],{},[478,64916,64917],{},"Orders",": represent assessment requests, candidate context, and lifecycle state",[46,64920,64921,64924],{},[478,64922,64923],{},"Responses",": structured results including scores, attributes, and artifacts",[19,64926,64927],{},"Orders include rich candidate, job, and application context, allowing providers to tailor assessments and return structured results directly into the ATS.",[35,64929,64931],{"id":64930},"real-time-readwrite-assessment-workflows","Real-time, read/write assessment workflows",[19,64933,64934],{},"The Assessment API supports both:",[72,64936,64937,64940,64943],{},[46,64938,64939],{},"Creating and managing assessment packages",[46,64941,64942],{},"Receiving assessment orders in real time",[46,64944,64945],{},"Updating orders with structured results and scores",[19,64947,64948,64949,64952],{},"All requests are ",[478,64950,64951],{},"stateless and routed directly to the source system","—no caching, no sync jobs, no stored records.",[35,64954,64956],{"id":64955},"using-assessment-data-in-ai-systems",[478,64957,64958],{},"Using assessment data in AI systems",[19,64960,64961],{},"Because assessment results are structured and returned in real time, they can be used to:",[72,64963,64964,64967,64970,64973],{},[46,64965,64966],{},"Generate candidate summaries and scoring insights",[46,64968,64969],{},"Feed structured evaluation data into copilots or hiring assistants",[46,64971,64972],{},"Trigger automated follow-ups or recommendations",[46,64974,64975],{},"Train models on hiring outcomes and performance signals",[67,64977,64979],{"id":64978},"what-you-can-build-with-the-assessment-api","What you can build with the Assessment API",[72,64981,64982,64985,64988,64991,64994],{},[46,64983,64984],{},"Embedded assessment marketplaces inside ATS platforms",[46,64986,64987],{},"Partner integrations with ATS vendors (Greenhouse, Ashby, Workable)",[46,64989,64990],{},"Recruiter-driven assessment workflows",[46,64992,64993],{},"Real-time candidate evaluation pipelines",[46,64995,64996],{},"AI scoring and feedback workflows tied to ATS activity",[35,64998,65000],{"id":64999},"embedded-assessment-marketplaces-inside-ats","Embedded assessment marketplaces inside ATS",[19,65002,65003],{},"Some ATS platforms support native assessment marketplaces, where providers can list assessment packages directly inside the product.",[19,65005,65006],{},"The Assessment API enables this model by:",[72,65008,65009,65012,65015,65018],{},[46,65010,65011],{},"Listing your packages inside the ATS",[46,65013,65014],{},"Allowing recruiters to select assessments directly",[46,65016,65017],{},"Sending orders in real time",[46,65019,65020],{},"Returning results back into the same flow",[67,65022,65024],{"id":65023},"how-the-assessment-api-differs-from-other-unified-apis",[478,65025,65026],{},"How the Assessment API differs from other Unified APIs",[19,65028,2288,65029,65032],{},[478,65030,65031],{},"Unified Verification API"," is used by ATS or HRIS platforms to call verification or assessment providers in a unified way.",[19,65034,65035],{},"In that flow:",[72,65037,65038,65041,65044],{},[46,65039,65040],{},"The ATS or HRIS platform initiates the request.",[46,65042,65043],{},"They do not need a direct partnership with the assessment provider.",[46,65045,65046],{},"The call is routed through Unified using the unified verification data models.",[19,65048,65049],{},"The Assessment API is different.",[19,65051,65052],{},"It is designed for assessment providers who want their assessment packages listed directly inside an ATS that supports embedded assessment integrations.",[19,65054,65055],{},"The integration is initiated by the recruiter inside the ATS, not by the assessment provider or backend workflow.",[35,65057,65059],{"id":65058},"how-this-differs-from-the-unified-ats-api","How This Differs from the Unified ATS API",[19,65061,2288,65062,65064],{},[478,65063,16934],{}," allows assessment providers to listen for job application changes and trigger an assessment when an application reaches a specific status.",[19,65066,65067],{},"That flow works across most ATS platforms supported by Unified and does not require a special assessment marketplace integration.",[19,65069,65070],{},"It is best suited for ATS platforms that do not support embedded assessment listings.",[19,65072,65073],{},"The new Unified Assessment API works in a different way:",[72,65075,65076,65079,65082,65085,65088,65091,65094],{},[46,65077,65078],{},"It connects directly to ATS platforms that have a dedicated 'assessment API.'",[46,65080,65081],{},"Your assessment packages are listed inside the ATS.",[46,65083,65084],{},"A recruiter manually selects a package for a candidate.",[46,65086,65087],{},"The ATS sends an assessment order through Unified.",[46,65089,65090],{},"You process the assessment.",[46,65092,65093],{},"You update the order.",[46,65095,65096],{},"The results are written back into the ATS.",[19,65098,65099],{},"The key difference:",[19,65101,65102],{},"The recruiter stays inside the ATS the entire time.",[19,65104,65105],{},"There is no external trigger based on status change. The recruiter explicitly orders the assessment.",[35,65107,65109],{"id":65108},"when-should-you-use-each","When Should You Use Each?",[19,65111,65112],{},"For assessment providers:",[72,65114,65115,65121],{},[46,65116,2604,65117,65120],{},[478,65118,65119],{},"Assessment API"," when the ATS supports embedded assessment listings and you have a partnership with that ATS.",[46,65122,2604,65123,65125],{},[478,65124,62257],{}," for all other ATS platforms.",[19,65127,65128],{},"Most providers will use both:",[72,65130,65131,65134],{},[46,65132,65133],{},"Assessment API for supported ATS platforms.",[46,65135,65136],{},"ATS API as the broad coverage fallback.",[19,65138,65139],{},"The Assessment API reduces recruiter friction but is limited to ATS platforms that expose this functionality.",[35,65141,65143],{"id":65142},"who-this-is-for","Who this is for",[72,65145,65146,65149,65152,65155],{},[46,65147,65148],{},"Assessment providers (coding tests, behavioral, psychometric, etc.)",[46,65150,65151],{},"Background check and verification providers",[46,65153,65154],{},"AI-based candidate evaluation platforms",[46,65156,65157],{},"Hiring infrastructure tools integrating into ATS ecosystems",[67,65159,65161],{"id":65160},"why-this-matters-for-assessment-providers","Why this matters for assessment providers",[72,65163,65164,65167,65170,65173],{},[46,65165,65166],{},"Higher completion rates (recruiter intent is explicit)",[46,65168,65169],{},"Less friction (no external tools)",[46,65171,65172],{},"Stronger ATS partnerships",[46,65174,65175],{},"Better UX for hiring teams",[67,65177,65179],{"id":65178},"supported-ats-integrations","Supported ATS Integrations",[19,65181,65182],{},"Currently, the Unified Assessment API supports the following ATS platforms:",[72,65184,65185,65188,65191,65193,65196,65199],{},[46,65186,65187],{},"Ashby",[46,65189,65190],{},"Cornerstone",[46,65192,14230],{},[46,65194,65195],{},"Recruitee",[46,65197,65198],{},"TalentLyft",[46,65200,12230],{},[19,65202,65203],{},"Each of these has a dedicated assessment integration that is separate from the standard ATS integration.",[19,65205,65206],{},"Only ATS platforms that support embedded assessment listings can be supported through this API.",[19,65208,65209],{},"Expansion to additional supported ATS platforms is ongoing.",[67,65211,52924],{"id":1745},[35,65213,65215],{"id":65214},"step-1-create-a-connection","Step 1: Create a Connection",[19,65217,65218],{},"First, you need to manually create a connection for your assessment integration. This connection will be used to authenticate requests from the ATS.",[19,65220,65221,65222,65225,65226,65229],{},"When creating the connection, you must supply a ",[478,65223,65224],{},"Partner API Key"," in the ",[109,65227,65228],{},"connection.auth.token"," field that you generate yourself. You will then share this API key with your end-customer to configure the integration in their ATS.",[19,65231,65232,65233,64537,65236,634],{},"Always check the authentication requirements for each assessment integration as some will require additional authentication information.  For example, Ashby also requires a ",[109,65234,65235],{},"Customer API Key",[109,65237,65238],{},"Partner ID",[19,65240,65241],{},[478,65242,65243],{},"Example Connection Creation:",[102,65245,65247],{"className":2318,"code":65246,"language":2320,"meta":107,"style":107},"{\n  \"integration_type\": \"greenhouseassessment\",\n  \"auth\": {\n    \"token\": \"YOUR_PARTNER_API_KEY\"\n  },\n}\n",[109,65248,65249,65253,65264,65270,65279,65283],{"__ignoreMap":107},[112,65250,65251],{"class":114,"line":115},[112,65252,2327],{"class":236},[112,65254,65255,65257,65259,65262],{"class":114,"line":126},[112,65256,39328],{"class":129},[112,65258,2335],{"class":236},[112,65260,65261],{"class":122},"\"greenhouseassessment\"",[112,65263,288],{"class":236},[112,65265,65266,65268],{"class":114,"line":135},[112,65267,39379],{"class":129},[112,65269,3888],{"class":236},[112,65271,65272,65274,65276],{"class":114,"line":147},[112,65273,39386],{"class":129},[112,65275,2335],{"class":236},[112,65277,65278],{"class":122},"\"YOUR_PARTNER_API_KEY\"\n",[112,65280,65281],{"class":114,"line":202},[112,65282,9512],{"class":236},[112,65284,65285],{"class":114,"line":208},[112,65286,584],{"class":236},[35,65288,65290],{"id":65289},"step-2-configure-webhooks","Step 2: Configure Webhooks",[19,65292,65293],{},"You also need to set up webhooks to receive assessment orders from the ATS systems.",[35,65295,65297],{"id":65296},"required-webhook","Required Webhook",[19,65299,65300],{},"Create a webhook with the following configuration:",[72,65302,65303,65310],{},[46,65304,65305,2335,65307],{},[478,65306,10476],{},[109,65308,65309],{},"assessment_order",[46,65311,65312,2335,65314],{},[478,65313,47612],{},[109,65315,31811],{},[19,65317,65318],{},"This webhook will be triggered whenever a recruiter requests an assessment for a candidate in the ATS.",[35,65320,65322],{"id":65321},"optional-webhook","Optional Webhook",[19,65324,65325],{},"Some ATS vendors (like Ashby) also send order cancellation events. You can optionally create an additional webhook:",[72,65327,65328,65334],{},[46,65329,65330,2335,65332],{},[478,65331,10476],{},[109,65333,65309],{},[46,65335,65336,2335,65338],{},[478,65337,47612],{},[109,65339,43961],{},[19,65341,65342],{},"This webhook will notify you when an assessment order is cancelled.",[35,65344,65346],{"id":65345},"step-3-provide-configuration-to-your-end-customer","Step 3: Provide Configuration to Your End-Customer",[19,65348,65349],{},"Once you've created the connection and webhook, provide the following information to your end-customer:",[43,65351,65352,65367],{},[46,65353,65354,2335,65357,65360],{},[478,65355,65356],{},"Base URL",[109,65358,65359],{},"https://api.unified.to/assessments/{connection_id}",[72,65361,65362],{},[46,65363,45832,65364,65366],{},[109,65365,12877],{}," with the actual connection ID from Step 1",[46,65368,65369,65371,65372],{},[478,65370,65224],{},": The token value you set in ",[109,65373,65228],{},[19,65375,65376],{},"Your end-customer will then input these credentials into their ATS software to enable the integration.",[67,65378,65380],{"id":65379},"how-the-assessment-flow-works",[478,65381,65382],{},"How the assessment flow works",[19,65384,65385],{},"Here's how the assessment flow works:",[43,65387,65388,65394,65400,65406,65415,65421,65431],{},[46,65389,65390,65393],{},[478,65391,65392],{},"Package Configuration",": You create assessment packages via the Unified API (w/ assessment packages API endpoints)",[46,65395,65396,65399],{},[478,65397,65398],{},"ATS Lists Packages",": The ATS queries your available packages",[46,65401,65402,65405],{},[478,65403,65404],{},"Recruiter Orders Assessment",": A recruiter selects a package and orders an assessment for a candidate",[46,65407,65408,2335,65411,65414],{},[478,65409,65410],{},"Webhook Notification",[1614,65412,1640],{"href":1638,"rel":65413},[1618]," sends you a webhook with the order details",[46,65416,65417,65420],{},[478,65418,65419],{},"Process Assessment",": You send the assessment to the candidate and process their response",[46,65422,65423,65426,65427,65430],{},[478,65424,65425],{},"Submit Results",": You submit the assessment results back to ",[1614,65428,1640],{"href":1638,"rel":65429},[1618]," (w/ assessment order update API endpoint)",[46,65432,65433,65436],{},[478,65434,65435],{},"Results in ATS",": The results appear in the ATS for the recruiter to review",[67,65438,65440],{"id":65439},"api-endpoints","API Endpoints",[35,65442,65444],{"id":65443},"assessment-packages","Assessment Packages",[19,65446,65447],{},"Manage your available assessment packages:",[72,65449,65450,65456,65462,65468,65474],{},[46,65451,65452,65455],{},[109,65453,65454],{},"POST /assessment/{connection_id}/package"," - Create a new package",[46,65457,65458,65461],{},[109,65459,65460],{},"GET /assessment/{connection_id}/package"," - List all packages",[46,65463,65464,65467],{},[109,65465,65466],{},"GET /assessment/{connection_id}/package/{id}"," - Get a specific package",[46,65469,65470,65473],{},[109,65471,65472],{},"PUT /assessment/{connection_id}/package/{id}"," - Update a package",[46,65475,65476,65479],{},[109,65477,65478],{},"DELETE /assessment/{connection_id}/package/{id}"," - Delete a package",[35,65481,65483],{"id":65482},"assessment-orders","Assessment Orders",[19,65485,65486],{},"Update assessment order results:",[72,65488,65489],{},[46,65490,65491,65494],{},[109,65492,65493],{},"PUT /assessment/{connection_id}/order/{id}"," - Update an order with results",[67,65496,65498],{"id":65497},"webhook-payload","Webhook Payload",[19,65500,65501,65502,65505],{},"When an assessment order is created, you'll receive a webhook with an ",[109,65503,65504],{},"AssessmentOrder"," payload:",[102,65507,65509],{"className":2318,"code":65508,"language":2320,"meta":107,"style":107},"{\n  \"id\": \"123\",\n  \"package_id\": \"your_package_id\",\n  \"candidate\": {\n    \"candidate_id\": \"candidate_456\",\n    \"email\": \"candidate@example.com\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone\": \"+1 123 456 7890\"\n  },\n  \"application\": {\n    \"id\": \"application_789\"\n  },\n  \"job\": {\n    \"id\": \"job_012\",\n    \"name\": \"Software Engineer\",\n  },\n  \"status\": \"OPEN\"\n}\n",[109,65510,65511,65515,65525,65537,65544,65556,65568,65580,65591,65601,65605,65612,65621,65625,65632,65643,65654,65658,65668],{"__ignoreMap":107},[112,65512,65513],{"class":114,"line":115},[112,65514,2327],{"class":236},[112,65516,65517,65519,65521,65523],{"class":114,"line":126},[112,65518,10925],{"class":129},[112,65520,2335],{"class":236},[112,65522,3156],{"class":122},[112,65524,288],{"class":236},[112,65526,65527,65530,65532,65535],{"class":114,"line":135},[112,65528,65529],{"class":129},"  \"package_id\"",[112,65531,2335],{"class":236},[112,65533,65534],{"class":122},"\"your_package_id\"",[112,65536,288],{"class":236},[112,65538,65539,65542],{"class":114,"line":147},[112,65540,65541],{"class":129},"  \"candidate\"",[112,65543,3888],{"class":236},[112,65545,65546,65549,65551,65554],{"class":114,"line":202},[112,65547,65548],{"class":129},"    \"candidate_id\"",[112,65550,2335],{"class":236},[112,65552,65553],{"class":122},"\"candidate_456\"",[112,65555,288],{"class":236},[112,65557,65558,65561,65563,65566],{"class":114,"line":208},[112,65559,65560],{"class":129},"    \"email\"",[112,65562,2335],{"class":236},[112,65564,65565],{"class":122},"\"candidate@example.com\"",[112,65567,288],{"class":236},[112,65569,65570,65573,65575,65578],{"class":114,"line":291},[112,65571,65572],{"class":129},"    \"first_name\"",[112,65574,2335],{"class":236},[112,65576,65577],{"class":122},"\"John\"",[112,65579,288],{"class":236},[112,65581,65582,65585,65587,65589],{"class":114,"line":299},[112,65583,65584],{"class":129},"    \"last_name\"",[112,65586,2335],{"class":236},[112,65588,52682],{"class":122},[112,65590,288],{"class":236},[112,65592,65593,65596,65598],{"class":114,"line":307},[112,65594,65595],{"class":129},"    \"phone\"",[112,65597,2335],{"class":236},[112,65599,65600],{"class":122},"\"+1 123 456 7890\"\n",[112,65602,65603],{"class":114,"line":315},[112,65604,9512],{"class":236},[112,65606,65607,65610],{"class":114,"line":323},[112,65608,65609],{"class":129},"  \"application\"",[112,65611,3888],{"class":236},[112,65613,65614,65616,65618],{"class":114,"line":329},[112,65615,26172],{"class":129},[112,65617,2335],{"class":236},[112,65619,65620],{"class":122},"\"application_789\"\n",[112,65622,65623],{"class":114,"line":341},[112,65624,9512],{"class":236},[112,65626,65627,65630],{"class":114,"line":346},[112,65628,65629],{"class":129},"  \"job\"",[112,65631,3888],{"class":236},[112,65633,65634,65636,65638,65641],{"class":114,"line":366},[112,65635,26172],{"class":129},[112,65637,2335],{"class":236},[112,65639,65640],{"class":122},"\"job_012\"",[112,65642,288],{"class":236},[112,65644,65645,65647,65649,65652],{"class":114,"line":381},[112,65646,26184],{"class":129},[112,65648,2335],{"class":236},[112,65650,65651],{"class":122},"\"Software Engineer\"",[112,65653,288],{"class":236},[112,65655,65656],{"class":114,"line":387},[112,65657,9512],{"class":236},[112,65659,65660,65663,65665],{"class":114,"line":392},[112,65661,65662],{"class":129},"  \"status\"",[112,65664,2335],{"class":236},[112,65666,65667],{"class":122},"\"OPEN\"\n",[112,65669,65670],{"class":114,"line":409},[112,65671,584],{"class":236},[67,65673,65675],{"id":65674},"submitting-results","Submitting Results",[19,65677,65678],{},"Once a candidate completes an assessment, submit the results using the update order endpoint:",[102,65680,65682],{"className":104,"code":65681,"language":106,"meta":107,"style":107},"PUT /assessment/{connection_id}/order/{order_id}\n",[109,65683,65684],{"__ignoreMap":107},[112,65685,65686,65689],{"class":114,"line":115},[112,65687,65688],{"class":118},"PUT",[112,65690,65691],{"class":122}," /assessment/{connection_id}/order/{order_id}\n",[19,65693,65694],{},[478,65695,65696],{},"Example Request:",[102,65698,65700],{"className":2318,"code":65699,"language":2320,"meta":107,"style":107},"{\n  \"status\": \"COMPLETED\",\n  \"score\": 85,\n  \"max_score\": 100,\n  \"result_url\": \"\u003Chttps://your-platform.com/results/order_123>\",\n  \"completed_at\": \"2024-01-15T10:30:00Z\",\n  \"attributes\": [\n    {\n      \"type\": \"TEXT\",\n      \"label\": \"Overall Assessment\",\n      \"value\": \"Strong candidate\"\n    }\n  ]\n}\n",[109,65701,65702,65706,65717,65729,65741,65753,65765,65772,65776,65786,65798,65807,65811,65815],{"__ignoreMap":107},[112,65703,65704],{"class":114,"line":115},[112,65705,2327],{"class":236},[112,65707,65708,65710,65712,65715],{"class":114,"line":126},[112,65709,65662],{"class":129},[112,65711,2335],{"class":236},[112,65713,65714],{"class":122},"\"COMPLETED\"",[112,65716,288],{"class":236},[112,65718,65719,65722,65724,65727],{"class":114,"line":135},[112,65720,65721],{"class":129},"  \"score\"",[112,65723,2335],{"class":236},[112,65725,65726],{"class":129},"85",[112,65728,288],{"class":236},[112,65730,65731,65734,65736,65739],{"class":114,"line":147},[112,65732,65733],{"class":129},"  \"max_score\"",[112,65735,2335],{"class":236},[112,65737,65738],{"class":129},"100",[112,65740,288],{"class":236},[112,65742,65743,65746,65748,65751],{"class":114,"line":202},[112,65744,65745],{"class":129},"  \"result_url\"",[112,65747,2335],{"class":236},[112,65749,65750],{"class":122},"\"\u003Chttps://your-platform.com/results/order_123>\"",[112,65752,288],{"class":236},[112,65754,65755,65758,65760,65763],{"class":114,"line":208},[112,65756,65757],{"class":129},"  \"completed_at\"",[112,65759,2335],{"class":236},[112,65761,65762],{"class":122},"\"2024-01-15T10:30:00Z\"",[112,65764,288],{"class":236},[112,65766,65767,65770],{"class":114,"line":291},[112,65768,65769],{"class":129},"  \"attributes\"",[112,65771,2372],{"class":236},[112,65773,65774],{"class":114,"line":299},[112,65775,1076],{"class":236},[112,65777,65778,65780,65782,65784],{"class":114,"line":307},[112,65779,32515],{"class":129},[112,65781,2335],{"class":236},[112,65783,4774],{"class":122},[112,65785,288],{"class":236},[112,65787,65788,65791,65793,65796],{"class":114,"line":315},[112,65789,65790],{"class":129},"      \"label\"",[112,65792,2335],{"class":236},[112,65794,65795],{"class":122},"\"Overall Assessment\"",[112,65797,288],{"class":236},[112,65799,65800,65802,65804],{"class":114,"line":323},[112,65801,11036],{"class":129},[112,65803,2335],{"class":236},[112,65805,65806],{"class":122},"\"Strong candidate\"\n",[112,65808,65809],{"class":114,"line":329},[112,65810,3946],{"class":236},[112,65812,65813],{"class":114,"line":341},[112,65814,2403],{"class":236},[112,65816,65817],{"class":114,"line":346},[112,65818,584],{"class":236},[19,65820,65821],{},"The results will then be written back to the ATS system, where recruiters can view them directly.",[67,65823,63242],{"id":10074},[19,65825,65826],{},"Unlike traditional integrations that rely on polling or status changes, the Assessment API enables real-time, recruiter-initiated workflows directly within ATS platforms.",[43,65828,65829,65835,65841,65847],{},[46,65830,65831,65834],{},[478,65832,65833],{},"Secure Your API Key",": Treat your Partner API Key as sensitive information. Only share it with trusted end-customers.",[46,65836,65837,65840],{},[478,65838,65839],{},"Handle Webhooks Reliably",": Implement retry logic and idempotency checks in your webhook handler to ensure you don't miss or duplicate orders.",[46,65842,65843,65846],{},[478,65844,65845],{},"Validate Webhook Data",": Always validate the webhook payload to ensure it contains the expected candidate and job information before processing.",[46,65848,65849,65852,65853,65855],{},[478,65850,65851],{},"Monitor Order Status",": Track the status of assessment orders and handle cancellations appropriately when the ",[109,65854,43961],{}," event webhook is received.",[67,65857,65859],{"id":65858},"support","Support",[19,65861,65862,65863,634],{},"For questions or issues with the Unified Assessment API, please contact our support team or refer to the ",[1614,65864,65867],{"href":65865,"rel":65866},"https://docs.unified.to/",[1618],"Unified.to Documentation",[19,65869,65870],{},"What is an assessment API for recruiting platforms?",[19,65872,65873],{},"An assessment API allows providers to integrate directly with ATS platforms so recruiters can request, manage, and review candidate assessments without leaving the ATS. It enables real-time order handling and structured results returned to the same system.",[19,65875,65876],{},"How do assessment providers integrate with ATS platforms?",[19,65878,65879],{},"Assessment providers integrate with ATS platforms either through embedded assessment APIs or through status-based triggers. Embedded integrations allow recruiters to select and order assessments directly inside the ATS, while triggered integrations operate based on application state changes.",[1558,65881,65882],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":107,"searchDepth":126,"depth":126,"links":65884},[65885,65886,65887,65888,65893,65896,65901,65902,65903,65910,65911,65915,65916,65917,65918],{"id":64820,"depth":126,"text":64821},{"id":64834,"depth":126,"text":64835},{"id":64841,"depth":126,"text":64842},{"id":64887,"depth":126,"text":64888,"children":65889},[65890,65891,65892],{"id":64903,"depth":135,"text":64904},{"id":64930,"depth":135,"text":64931},{"id":64955,"depth":135,"text":64958},{"id":64978,"depth":126,"text":64979,"children":65894},[65895],{"id":64999,"depth":135,"text":65000},{"id":65023,"depth":126,"text":65026,"children":65897},[65898,65899,65900],{"id":65058,"depth":135,"text":65059},{"id":65108,"depth":135,"text":65109},{"id":65142,"depth":135,"text":65143},{"id":65160,"depth":126,"text":65161},{"id":65178,"depth":126,"text":65179},{"id":1745,"depth":126,"text":52924,"children":65904},[65905,65906,65907,65908,65909],{"id":65214,"depth":135,"text":65215},{"id":65289,"depth":135,"text":65290},{"id":65296,"depth":135,"text":65297},{"id":65321,"depth":135,"text":65322},{"id":65345,"depth":135,"text":65346},{"id":65379,"depth":126,"text":65382},{"id":65439,"depth":126,"text":65440,"children":65912},[65913,65914],{"id":65443,"depth":135,"text":65444},{"id":65482,"depth":135,"text":65483},{"id":65497,"depth":126,"text":65498},{"id":65674,"depth":126,"text":65675},{"id":10074,"depth":126,"text":63242},{"id":65858,"depth":126,"text":65859},"Most assessment integrations rely on application status changes or external tools. Recruiters switch systems, and providers handle fragmented integration...",{"img":65921,"date":65922,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_assessment_api_embed_assessments_inside_ats_platforms-icon.png","2026-02-09T21:10:00.000Z","/guides/unified_assessment_api_embed_assessments_inside_ats_platforms",{"title":64796,"description":65919},"guides/unified_assessment_api_embed_assessments_inside_ats_platforms","6xvs6KnPvyMP5lv2aavPkRkEKgXy73G3CRrOn4F6uuQ",{"id":65928,"title":65929,"body":65930,"description":66015,"extension":1576,"meta":66016,"navigation":271,"path":66019,"seo":66020,"stem":66021,"__hash__":66022},"guides/guides/unified_mcp_server.md","Unified's MCP Server",{"type":9,"value":65931,"toc":66011},[65932,65935,65937,65942,65948,65951,65954,65968,65971,65975,66005],[12,65933,65929],{"id":65934},"unifieds-mcp-server",[16,65936],{},[19,65938,65939],{},[22,65940,65941],{},"May 24, 2025",[19,65943,65944,65945,65947],{},"Unified has launched an MCP server that connects any Unified connection to LLM (Large Language Model) providers supporting the newest MCP protocols. The available MCP ",[109,65946,26303],{}," will be determined by the integration's feature support and the connection's requested permissions.",[19,65949,65950],{},"All MCP tool calls are executed live against the source API. Unified does not cache or store end-customer data, and access is governed by scoped permissions and tool allow-listing.",[67,65952,65953],{"id":11206},"Use-cases:",[72,65955,65956,65962],{},[46,65957,65958,65961],{},[478,65959,65960],{},"End-Customer Conversation with LLMs",": Allows end-customers to interact with an LLM using permissioned tools backed by the data they've explicitly authorized through a Unified connection.",[46,65963,65964,65967],{},[478,65965,65966],{},"Debugging End-Customers' Connections",": Allows your product and support teams to assist your end-customers by debugging their Unified connections.  Please make sure that you observe all privacy policies, both yours and your regions's, since end-customer data may be made available to the LLM based on the permissions and tools you explicitly configure. Unified provides options to restrict tools, scope permissions, and remove sensitive fields from responses.",[19,65969,65970],{},"MCP is a new protocol and it is moving fast.  We expect more LLM & agent clients to support its newer Streamable HTTP transport protocol.  We also expect that the MCP protocol will continue to expand quickly.  Stay tuned as we also keep up.",[67,65972,65974],{"id":65973},"sample-queries","Sample queries:",[72,65976,65977,65980,65987,65990,65993,65996,65999,66002],{},[46,65978,65979],{},"List candidates for job X",[46,65981,65982,65983],{},"List deals for contact with email address ",[1614,65984,65986],{"href":65985},"mailto:joe@foo.com","joe@foo.com",[46,65988,65989],{},"update application 12345 with a status of HIRED",[46,65991,65992],{},"summarize the accounting balance sheet report",[46,65994,65995],{},"find the vacation policy by listing the pages in Notion",[46,65997,65998],{},"post a message in Slack summarizing this deal",[46,66000,66001],{},"create an invoice for customer X",[46,66003,66004],{},"schedule an interview and notify the candidate",[19,66006,66007,66008],{},"More information can be found at ",[1614,66009,28844],{"href":28844,"rel":66010},[1618],{"title":107,"searchDepth":126,"depth":126,"links":66012},[66013,66014],{"id":11206,"depth":126,"text":65953},{"id":65973,"depth":126,"text":65974},"Unified has launched an MCP server that connects any Unified connection to LLM (Large Language Model) providers supporting the newest MCP protocols. The...",{"img":66017,"date":66018,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_server-icon.png","2025-05-24T00:00:00.000Z","/guides/unified_mcp_server",{"title":65929,"description":66015},"guides/unified_mcp_server","jZhBkl9hwgAM64CGepHQCpJ05b7Ol6EgNMFABjndrQs",{"id":66024,"title":66025,"body":66026,"description":66459,"extension":1576,"meta":66460,"navigation":271,"path":66463,"seo":66464,"stem":66465,"__hash__":66466},"guides/guides/unlock_real_time_data_with_virtual_webhooks.md","Unlock real-time data with virtual webhooks",{"type":9,"value":66027,"toc":66450},[66028,66031,66033,66038,66047,66050,66058,66072,66076,66082,66085,66135,66138,66141,66144,66152,66155,66166,66169,66175,66179,66182,66295,66298,66302,66305,66310,66313,66320,66327,66332,66335,66338,66346,66351,66356,66359,66364,66371,66375,66378,66380,66391,66394,66398,66409,66412,66416,66419],[12,66029,66025],{"id":66030},"unlock-real-time-data-with-virtual-webhooks",[16,66032],{},[19,66034,66035],{},[22,66036,66037],{},"February 13, 2025",[19,66039,66040,66041,66046],{},"Product teams building real-time applications face a common challenge: most third-party APIs don't offer webhooks (In fact, our ",[1614,66042,66045],{"href":66043,"rel":66044},"https://unified.to/blog/the_state_of_saas_apis_2024",[1618],"State of SaaS APIs report"," found only 11% of APIs have built-in support for webhooks). This leads to inefficient polling, manually handling rate limits, and writing custom logic just to keep data fresh.",[19,66048,66049],{},"But what if you could control webhook updates while reducing API costs and complexity?",[19,66051,66052,66053,66057],{},"That's exactly what Unified.to's ",[1614,66054,47410],{"href":66055,"rel":66056},"https://unified.to/blog/introducing_powerful_enhancements_to_webhooks",[1618]," enable. In this article, we'll review:",[72,66059,66060,66063,66066,66069],{},[46,66061,66062],{},"How virtual webhooks work",[46,66064,66065],{},"Why they help control API costs by managing request frequency",[46,66067,66068],{},"How they eliminate the need for custom rate-limit handling systems",[46,66070,66071],{},"Why virtual webhooks are the fastest way to implement real-time updates",[67,66073,66075],{"id":66074},"why-use-virtual-webhooks","Why use virtual webhooks?",[19,66077,66078],{},[1603,66079],{"alt":66080,"src":66081},"virtual_webhooks.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unlock_real_time_data_with_virtual_webhooks-0.png",[19,66083,66084],{},"Pairing Unified.to's virtual webhooks with your product's integration strategy means:",[72,66086,66087,66093,66099,66105,66111,66117,66123,66129],{},[46,66088,66089,66092],{},[478,66090,66091],{},"Webhooks for nearly every integration"," – Get real-time updates even from APIs that don't natively support webhooks, all through a unified API.",[46,66094,66095,66098],{},[478,66096,66097],{},"Cost-efficient API usage"," – Unlike native webhooks, which can be unpredictable in frequency and costly, virtual webhooks control API call frequency, reducing overages and optimizing usage.",[46,66100,66101,66104],{},[478,66102,66103],{},"One unified schema"," – Whether the source supports native webhooks or requires polling, data is normalized into a consistent format—no custom polling logic needed.",[46,66106,66107,66110],{},[478,66108,66109],{},"Optimized sync performance"," – Intelligent update detection, seamless and automatic rate-limit handling, and configurable polling intervals (e.g., every minute, every 30 minutes, every hour).",[46,66112,66113,66116],{},[478,66114,66115],{},"Faster time-to-market"," – Virtual webhooks eliminate the need to build custom data collection.",[46,66118,66119,66122],{},[478,66120,66121],{},"Historical data access"," – Instantly access past records when creating a webhook subscription, eliminating the need for separate API calls.",[46,66124,66125,66128],{},[478,66126,66127],{},"Built-in observability"," – Monitor webhook activity with logs, audit trails, and health tracking.",[46,66130,66131,66134],{},[478,66132,66133],{},"Event-driven AI and automation"," – Trigger AI workflows and automation in response to real-time data changes.",[19,66136,66137],{},"Instead of dealing with a patchwork of webhook, polling, and batch sync solutions, Unified.to's virtual webhooks create a consistent, scalable way to access real-time data across your integrations.",[67,66139,66062],{"id":66140},"how-virtual-webhooks-work",[19,66142,66143],{},"Webhooks provide a push-based way to receive data updates, eliminating the need for polling. But most APIs don't support them, which forces developers to either:",[43,66145,66146,66149],{},[46,66147,66148],{},"Poll the API (which wastes API calls and delays updates), or",[46,66150,66151],{},"Manually mix polling and webhooks (adding complexity and inconsistencies).",[19,66153,66154],{},"Unified.to's virtual webhooks solve this by mimicking native webhooks, even when the source API doesn't provide them:",[72,66156,66157,66160,66163],{},[46,66158,66159],{},"We monitor your customers' connections on a scheduled interval that you configure (e.g., as frequently as every minute) and detect changes automatically",[46,66161,66162],{},"We push updates to your webhook endpoint, just like a native webhook would",[46,66164,66165],{},"You subscribe and manage webhooks the same way you would with a real webhook",[19,66167,66168],{},"No polling logic. No wasted API calls. Just real-time updates, everywhere.",[19,66170,66171],{},[1614,66172,66174],{"href":39839,"rel":66173},[1618],"Explore documentation",[67,66176,66178],{"id":66177},"how-virtual-webhooks-compare-to-traditional-webhooks-and-polling","How virtual webhooks compare to traditional webhooks and polling",[19,66180,66181],{},"Most third-party APIs don't offer native webhooks, forcing teams to choose between batch syncs, polling, or manual workarounds.",[1868,66183,66184,66208],{},[1871,66185,66186],{},[1874,66187,66188,66193,66198,66203],{},[1877,66189,66190],{},[478,66191,66192],{},"Feature",[1877,66194,66195],{},[478,66196,66197],{},"Unified.to Virtual Webhooks",[1877,66199,66200],{},[478,66201,66202],{},"Native Webhooks",[1877,66204,66205],{},[478,66206,66207],{},"Polling",[1890,66209,66210,66224,66236,66248,66259,66272,66284],{},[1874,66211,66212,66215,66218,66221],{},[1895,66213,66214],{},"Works even if API doesn't support webhooks",[1895,66216,66217],{},"✅ Yes",[1895,66219,66220],{},"❌ No",[1895,66222,66223],{},"✅ Yes, but inefficient",[1874,66225,66226,66229,66231,66233],{},[1895,66227,66228],{},"Real-time event updates",[1895,66230,66217],{},[1895,66232,66217],{},[1895,66234,66235],{},"❌ No, delayed",[1874,66237,66238,66241,66243,66245],{},[1895,66239,66240],{},"API rate limit friendly",[1895,66242,66217],{},[1895,66244,66217],{},[1895,66246,66247],{},"❌ No, high API usage",[1874,66249,66250,66253,66255,66257],{},[1895,66251,66252],{},"Historical data retrieval",[1895,66254,66217],{},[1895,66256,66220],{},[1895,66258,66220],{},[1874,66260,66261,66264,66267,66269],{},[1895,66262,66263],{},"Fine-grained sync control",[1895,66265,66266],{},"✅ Yes (adjust polling frequency)",[1895,66268,66220],{},[1895,66270,66271],{},"✅ Yes, but manual",[1874,66273,66274,66277,66279,66282],{},[1895,66275,66276],{},"Built-in error handling & retries",[1895,66278,66217],{},[1895,66280,66281],{},"❌ Varies by API",[1895,66283,66220],{},[1874,66285,66286,66289,66291,66293],{},[1895,66287,66288],{},"Webhook observability (logs, health monitoring)",[1895,66290,66217],{},[1895,66292,66281],{},[1895,66294,66220],{},[19,66296,66297],{},"Virtual webhooks provide all the benefits of native webhooks, even when APIs don't support them, while eliminating the inefficiencies of polling.",[67,66299,66301],{"id":66300},"product-use-cases","Product use cases",[19,66303,66304],{},"Let's look at how developers and product teams can leverage virtual webhooks in real-world applications.",[19,66306,66307],{},[478,66308,66309],{},"AI-powered customer support",[19,66311,66312],{},"Virtual webhooks can update AI models in real-time when new support tickets are created. Instead of polling a help desk API every few minutes, an AI assistant can instantly respond to customer inquiries or escalate issues.",[19,66314,66315],{},[1614,66316,66319],{"href":66317,"rel":66318},"https://unified.to/ticketing",[1618],"Unified Ticketing API",[19,66321,66322],{},[1614,66323,66326],{"href":66324,"rel":66325},"https://unified.to/blog/how_to_build_a_discord_support_bot_with_unified_and_langbase",[1618],"Build an AI Support Bot",[19,66328,66329],{},[478,66330,66331],{},"Automated financial reporting",[19,66333,66334],{},"Fintech and accounting applications rely on up-to-date financial data to generate reports, sync transactions, and reconcile accounts. However, many accounting platforms lack real-time webhook support, meaning transaction updates often rely on batch syncs or polling.",[19,66336,66337],{},"With Unified.to's virtual webhooks, accounting software can:",[72,66339,66340,66343],{},[46,66341,66342],{},"Get notified instantly when new transactions, invoices, or payments are recorded",[46,66344,66345],{},"Trigger automatic reconciliation workflows instead of waiting for scheduled syncs",[19,66347,66348],{},[1614,66349,23163],{"href":23161,"rel":66350},[1618],[19,66352,66353],{},[478,66354,66355],{},"Recruitment automation",[19,66357,66358],{},"Hiring teams often integrate with multiple ATS platforms—some of which lack real-time event support. Virtual webhooks enable AI-powered candidate screening to kick in the moment a new application is received, ensuring faster and more efficient hiring workflows.",[19,66360,66361],{},[1614,66362,16934],{"href":1710,"rel":66363},[1618],[19,66365,66366],{},[1614,66367,66370],{"href":66368,"rel":66369},"https://unified.to/blog/how_herohunt_saved_ten_months_of_engineering_time_with_unified",[1618],"How HeroHunt added 20 integrations in 1 week",[67,66372,66374],{"id":66373},"how-much-polling-actually-costs","How much polling actually costs",[19,66376,66377],{},"Polling isn't just inefficient—it's expensive.",[19,66379,10603],{},[72,66381,66382,66385,66388],{},[46,66383,66384],{},"Polling every 5 minutes on 1000 accounts = 288,000 API requests per day",[46,66386,66387],{},"Polling every 1 minute on 1000 accounts = 1.4 million API requests per day",[46,66389,66390],{},"With virtual webhooks, API requests are dramatically reduced, as data is only fetched when changes occur. In low-activity accounts, this can mean near-zero requests, while high-activity accounts still see significant reductions compared to constant polling.",[19,66392,66393],{},"Instead of burning API quota on polling, virtual webhooks ensure data flows only when necessary, dramatically reducing costs and improving responsiveness.",[67,66395,66397],{"id":66396},"what-happens-if-you-dont-use-virtual-webhooks","What happens if you don't use virtual webhooks?",[72,66399,66400,66403,66406],{},[46,66401,66402],{},"You could hit API rate limits while continuously polling for updates",[46,66404,66405],{},"You could rely on batch syncs, leading to outdated or incomplete data",[46,66407,66408],{},"You could spend months building and maintaining custom webhook fallbacks for every integration",[19,66410,66411],{},"Or… you could just use Unified.to's virtual webhooks to handle rate limits and get real-time updates across all your integrations.",[67,66413,66415],{"id":66414},"start-using-unifiedtos-virtual-webhooks","Start using Unified.to's virtual webhooks",[19,66417,66418],{},"Ready to stop polling and start working with real-time data everywhere? Here's how to get started:",[72,66420,66421,66428,66435,66442],{},[46,66422,66423,66427],{},[1614,66424,66426],{"href":12214,"rel":66425},[1618],"Start a free trial"," to access virtual webhooks",[46,66429,66430,66434],{},[1614,66431,66433],{"href":1768,"rel":66432},[1618],"Join our Discord"," to connect with our team and get support",[46,66436,66437,66441],{},[1614,66438,66440],{"href":39839,"rel":66439},[1618],"Review our documentation"," for step-by-step guidance on setting up webhooks",[46,66443,66444,66449],{},[1614,66445,66448],{"href":66446,"rel":66447},"https://unified.to/changelog",[1618],"See our changelog"," for virtual webhook enhancements",{"title":107,"searchDepth":126,"depth":126,"links":66451},[66452,66453,66454,66455,66456,66457,66458],{"id":66074,"depth":126,"text":66075},{"id":66140,"depth":126,"text":66062},{"id":66177,"depth":126,"text":66178},{"id":66300,"depth":126,"text":66301},{"id":66373,"depth":126,"text":66374},{"id":66396,"depth":126,"text":66397},{"id":66414,"depth":126,"text":66415},"Product teams building real-time applications face a common challenge, most third-party APIs don't offer webhooks (In fact, our State of SaaS APIs report found...",{"img":66461,"date":66462,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/unlock_real_time_data_with_virtual_webhooks-icon.png","2025-02-13T00:00:00.000Z","/guides/unlock_real_time_data_with_virtual_webhooks",{"title":66025,"description":66459},"guides/unlock_real_time_data_with_virtual_webhooks","nQSvnxh-SOg_CL4nU_bd8lH2FSug6o-dGmiX69C_fk8",{"id":66468,"title":66469,"body":66470,"description":66484,"extension":1576,"meta":66799,"navigation":271,"path":66802,"seo":66803,"stem":66804,"__hash__":66805},"guides/guides/use_unified_to_sign_in_your_users_into_your_application.md","Use Unified to sign in your users into your application",{"type":9,"value":66471,"toc":66794},[66472,66475,66477,66482,66485,66488,66492,66495,66500,66503,66508,66511,66519,66524,66527,66530,66534,66537,66540,66556,66611,66614,66621,66627,66633,66638,66643,66648,66651,66655,66658,66663,66666,66676,66686,66689,66743,66746,66788,66791],[12,66473,66469],{"id":66474},"use-unified-to-sign-in-your-users-into-your-application",[16,66476],{},[19,66478,66479],{},[22,66480,66481],{},"August 31, 2023",[19,66483,66484],{},"Before your users can utilize your application and any of Unified.to's integrations, they need to sign in to your application.",[19,66486,66487],{},"Luckily, we've simplified user authentication through our Unified Authentication API. Just follow these steps.",[67,66489,66491],{"id":66490},"_1-activate-authentication-integrations","1. Activate Authentication integrations",[19,66493,66494],{},"1.1 Click on the 'Integrations' menu, and then on the 'Authentication Integrations' option.",[19,66496,66497],{},[1603,66498],{"alt":11593,"src":66499},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-0.png",[19,66501,66502],{},"1.2 Activate the integrations that you would like to use to sign-in your users into your application by clicking on each desired integration.",[19,66504,66505],{},[1603,66506],{"alt":11593,"src":66507},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-1.png",[19,66509,66510],{},"1.3 If available, you can chose to use Unified's branding and name on the authentication page that your users see with signing-in to your application.  We don't recommend this for production applications, but this is a great option to test the authentication feature.",[19,66512,66513,66514,66518],{},"1.4 If you want to add your own branding to the authentication pages,  then you will need to first obtain your own OAuth2 application credentials from the specific integration vendors (eg. Google).  For help on creating your own OAuth2 application, please see ",[1614,66515,66517],{"href":16294,"rel":66516},[1618],"Generating OAuth2 Credentials"," or click on the 'Get your own OAuth2 credentials' link.  Once you have that, enter your client ID and client secret that you obtained from the integration vendor.",[19,66520,66521],{},[1603,66522],{"alt":11593,"src":66523},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-2.png",[19,66525,66526],{},"1.5 Click on the 'Activate' button to enable this integration.",[19,66528,66529],{},"1.6 Repeat for all of the integrations that you want to use to authenticate your users.",[67,66531,66533],{"id":66532},"_2-display-sign-in-links-to-your-users","2. Display sign-in links to your users",[19,66535,66536],{},"Now that you have a list of Authentication connections, you can incorporate them into your application.",[19,66538,66539],{},"You have two options:",[43,66541,66542,66549],{},[46,66543,66544,66545,66548],{},"Remember the integration types (ie. google, discord, workday) and create links that point to our authentication API endpoint:\n",[109,66546,66547],{},"https//api.unified.to/unified/integration/login/{workspace_id}/{integration_type}?redirect=true",".  You can style that link however you like.",[46,66550,66551,66552,66555],{},"Call the our API that returns a list of integrations; ",[109,66553,66554],{},"https//api.unified.to/unified/integration/workspace/{workspace_id}?summary=true&active=true&categories=auth",". This will return all activated Authentication integrations and each will have information that you can use to style your Sign-in links;",[102,66557,66559],{"className":2318,"code":66558,"language":2320,"meta":107,"style":107},"[\n    {\n        logo_url: \"https://localhost:8000/docs/images/google.png\",\n        name: \"Google\",\n        type: \"google\"\n    }\n]\n",[109,66560,66561,66565,66569,66581,66593,66603,66607],{"__ignoreMap":107},[112,66562,66563],{"class":114,"line":115},[112,66564,2728],{"class":236},[112,66566,66567],{"class":114,"line":126},[112,66568,1076],{"class":236},[112,66570,66571,66574,66576,66579],{"class":114,"line":135},[112,66572,66573],{"class":2885},"        logo_url",[112,66575,2335],{"class":236},[112,66577,66578],{"class":122},"\"https://localhost:8000/docs/images/google.png\"",[112,66580,288],{"class":236},[112,66582,66583,66586,66588,66591],{"class":114,"line":147},[112,66584,66585],{"class":2885},"        name",[112,66587,2335],{"class":236},[112,66589,66590],{"class":122},"\"Google\"",[112,66592,288],{"class":236},[112,66594,66595,66598,66600],{"class":114,"line":202},[112,66596,66597],{"class":2885},"        type",[112,66599,2335],{"class":236},[112,66601,66602],{"class":122},"\"google\"\n",[112,66604,66605],{"class":114,"line":208},[112,66606,3946],{"class":236},[112,66608,66609],{"class":114,"line":291},[112,66610,2794],{"class":236},[19,66612,66613],{},"The Sign-in URL can have the following optional parameters:",[19,66615,66616,54868,66618,66620],{},[109,66617,47101],{},[109,66619,1340],{}," to redirect the user or if empty, will return the URL as string in its response",[19,66622,66623,66626],{},[109,66624,66625],{},"success_redirect"," - the URL that the user will be redirected to once they have successfully authenticated with that integration vendor",[19,66628,66629,66632],{},[109,66630,66631],{},"failure_redirect"," - the URL that the user will be redirected to if there is an error or other issue preventing the user from being authenticated by the integration vendor",[19,66634,66635,66637],{},[109,66636,64544],{}," - a string that will be sent back to the success_redirect. You can use this to remember a user ID or other identifier.",[43,66639,66640],{},[46,66641,66642],{},"An alternative to building your own Sign-in page is to use our Embedded Sign-in widget.  Click on the Settings menu and then on the Embedded Sign-in option.",[19,66644,66645],{},[1603,66646],{"alt":11593,"src":66647},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-3.png",[19,66649,66650],{},"Copy the CSS and code and insert it into your own application.",[67,66652,66654],{"id":66653},"step-3-verify-a-sign-in-attempt","Step 3: Verify a sign-in attempt",[19,66656,66657],{},"Once the user clicks on the authentication button/link, they will be redirect to the integration vendor's authentication page.",[19,66659,66660],{},[1603,66661],{"alt":11593,"src":66662},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-4.png",[19,66664,66665],{},"btw: it is important to note that the authentication pages are not Unified's pages but that of the integration vendor.  Unified never sees the user's login credentials including their password.",[19,66667,66668,66669,66671,66672,66675],{},"Once the user successfully signs-in, they are redirected back to your application (or to the location of the ",[109,66670,66625],{}," URL parameter from step 2). A ",[109,66673,66674],{},"jwt"," parameter will be appended to that URL.",[19,66677,2288,66678,66680,66681,66685],{},[109,66679,66674],{}," is a base64 encoded ",[1614,66682,64732],{"href":66683,"rel":66684},"https://jwt.io/",[1618],"  and is signed with your Workspace Secret. Verify the JWT with your workspace secret on your server (NOT in your browser as the workspace secret is not public).",[19,66687,66688],{},"Example code to verify a JWT on a NodeJS server:",[102,66690,66692],{"className":9951,"code":66691,"language":9953,"meta":107,"style":107},"try {\n    let result = JWT.verify( req.payload.jwt, workspace.secret )\n} catch (err) {\n    console.error(err);\n}\n",[109,66693,66694,66701,66721,66730,66739],{"__ignoreMap":107},[112,66695,66696,66699],{"class":114,"line":115},[112,66697,66698],{"class":229},"try",[112,66700,280],{"class":236},[112,66702,66703,66705,66708,66710,66713,66715,66718],{"class":114,"line":126},[112,66704,14442],{"class":229},[112,66706,66707],{"class":236}," result ",[112,66709,335],{"class":229},[112,66711,66712],{"class":129}," JWT",[112,66714,634],{"class":236},[112,66716,66717],{"class":118},"verify",[112,66719,66720],{"class":236},"( req.payload.jwt, workspace.secret )\n",[112,66722,66723,66725,66727],{"class":114,"line":135},[112,66724,332],{"class":236},[112,66726,20123],{"class":229},[112,66728,66729],{"class":236}," (err) {\n",[112,66731,66732,66734,66736],{"class":114,"line":147},[112,66733,17339],{"class":236},[112,66735,20134],{"class":118},[112,66737,66738],{"class":236},"(err);\n",[112,66740,66741],{"class":114,"line":202},[112,66742,584],{"class":236},[19,66744,66745],{},"The decoded JWT will contain a name and emails field:",[102,66747,66749],{"className":2318,"code":66748,"language":2320,"meta":107,"style":107},"{\n    name: \"Jane Smith\",\n    emails: [\"jane@foo.com\", \"jsmith89@gmail.com\"]\n}\n",[109,66750,66751,66755,66767,66784],{"__ignoreMap":107},[112,66752,66753],{"class":114,"line":115},[112,66754,2327],{"class":236},[112,66756,66757,66760,66762,66765],{"class":114,"line":126},[112,66758,66759],{"class":2885},"    name",[112,66761,2335],{"class":236},[112,66763,66764],{"class":122},"\"Jane Smith\"",[112,66766,288],{"class":236},[112,66768,66769,66772,66774,66777,66779,66782],{"class":114,"line":135},[112,66770,66771],{"class":2885},"    emails",[112,66773,3903],{"class":236},[112,66775,66776],{"class":122},"\"jane@foo.com\"",[112,66778,1046],{"class":236},[112,66780,66781],{"class":122},"\"jsmith89@gmail.com\"",[112,66783,2794],{"class":236},[112,66785,66786],{"class":114,"line":147},[112,66787,584],{"class":236},[19,66789,66790],{},"Use the user's email to log them into your application as it is verified by the integration.",[1558,66792,66793],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":107,"searchDepth":126,"depth":126,"links":66795},[66796,66797,66798],{"id":66490,"depth":126,"text":66491},{"id":66532,"depth":126,"text":66533},{"id":66653,"depth":126,"text":66654},{"img":66800,"date":66801,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-icon.png","2023-08-31T00:00:00.000Z","/guides/use_unified_to_sign_in_your_users_into_your_application",{"title":66469,"description":66484},"guides/use_unified_to_sign_in_your_users_into_your_application","tFRpHhzvxBQMQVghMWoz6mJtdZ7X9lIZrSCchfbZW60",{"id":66807,"title":66808,"body":66809,"description":67129,"extension":1576,"meta":67130,"navigation":271,"path":67133,"seo":67134,"stem":67135,"__hash__":67136},"guides/guides/workday_vs_workday_legacy_why_unified_supports_both.md","Workday vs Workday Legacy — Why Unified.to Supports Both",{"type":9,"value":66810,"toc":67124},[66811,66814,66816,66821,66827,66844,66855,66859,66862,66898,67026,67030,67035,67041,67046,67052,67057,67062,67067,67072,67077,67082,67087,67092,67097,67102,67104,67110,67116,67121],[12,66812,66808],{"id":66813},"workday-vs-workday-legacy-why-unifiedto-supports-both",[16,66815],{},[19,66817,66818],{},[22,66819,66820],{},"July 22, 2025",[19,66822,66823,66824,171],{},"Workday provides ",[478,66825,66826],{},"two main API integration formats",[43,66828,66829,66835],{},[46,66830,66831,66834],{},[478,66832,66833],{},"Workday REST API"," — their latest modern API, but still under active development.",[46,66836,66837,66840,66841,66843],{},[478,66838,66839],{},"Workday SOAP API"," (often referred to as ",[22,66842,11444],{},") — the older but mature API that still covers some critical endpoints not yet available in REST.",[19,66845,66846,66847,66850,66851,66854],{},"To give you maximum flexibility and to ensure you can access ",[478,66848,66849],{},"all the data and actions you need",", Unified.to supports ",[478,66852,66853],{},"both"," APIs.",[67,66856,66858],{"id":66857},"why-you-might-need-both","Why You Might Need Both",[19,66860,66861],{},"While Workday is steadily improving their REST API, there are still a few important gaps. Here's why using both makes sense today:",[43,66863,66864,66870,66876,66882,66892],{},[46,66865,66866,66869],{},[478,66867,66868],{},"Application Creation"," — Workday's REST API does not currently support creating job applications. This is only available through the Legacy SOAP API.",[46,66871,66872,66875],{},[478,66873,66874],{},"Candidate Lists"," — Retrieving a full list of candidates is not yet supported in REST but is fully available through the Legacy SOAP API.",[46,66877,66878,66881],{},[478,66879,66880],{},"Create Job"," — Similar to applications, creating jobs still relies on the Legacy API.",[46,66883,66884,66887,66888,66891],{},[478,66885,66886],{},"Attachments"," — The REST API ",[478,66889,66890],{},"does"," support listing and downloading attachments — which the Legacy SOAP API does not.",[46,66893,66894,66897],{},[478,66895,66896],{},"Future Coverage"," — Workday continues to expand REST API features. As new endpoints become available, Unified.to will adopt them immediately so you always have the best option.",[1868,66899,66900,66912],{},[1871,66901,66902],{},[1874,66903,66904,66906,66909],{},[1877,66905],{},[1877,66907,66908],{},"WorkDay REST",[1877,66910,66911],{},"WorkDay Legacy",[1890,66913,66914,66923,66933,66943,66953,66963,66972,66981,66990,66999,67008,67017],{},[1874,66915,66916,66919,66921],{},[1895,66917,66918],{},"ATS Activity",[1895,66920,31989],{},[1895,66922],{},[1874,66924,66925,66928,66930],{},[1895,66926,66927],{},"ATS Application",[1895,66929],{},[1895,66931,66932],{},"List, Get, Create, Update",[1874,66934,66935,66938,66941],{},[1895,66936,66937],{},"ATS Candidate",[1895,66939,66940],{},"Create, Get",[1895,66942,66932],{},[1874,66944,66945,66948,66951],{},[1895,66946,66947],{},"ATS Document",[1895,66949,66950],{},"List, Get, Create, Download",[1895,66952],{},[1874,66954,66955,66958,66961],{},[1895,66956,66957],{},"ATS Interview",[1895,66959,66960],{},"List, Get",[1895,66962,66932],{},[1874,66964,66965,66968,66970],{},[1895,66966,66967],{},"ATS Job",[1895,66969,66960],{},[1895,66971,66932],{},[1874,66973,66974,66977,66979],{},[1895,66975,66976],{},"ATS Scorecard",[1895,66978,66960],{},[1895,66980,66932],{},[1874,66982,66983,66986,66988],{},[1895,66984,66985],{},"HR Employee",[1895,66987,66960],{},[1895,66989,66932],{},[1874,66991,66992,66995,66997],{},[1895,66993,66994],{},"HR Group",[1895,66996,66960],{},[1895,66998],{},[1874,67000,67001,67004,67006],{},[1895,67002,67003],{},"HR Timeoff",[1895,67005,66960],{},[1895,67007],{},[1874,67009,67010,67013,67015],{},[1895,67011,67012],{},"Accounting Contact",[1895,67014,66960],{},[1895,67016],{},[1874,67018,67019,67022,67024],{},[1895,67020,67021],{},"Accounting Invoice",[1895,67023,66960],{},[1895,67025],{},[67,67027,67029],{"id":67028},"frequently-asked-questions-answers","Frequently Asked Questions & Answers",[19,67031,67032],{},[478,67033,67034],{},"Question: Do I have to send XML requests for Workday Legacy?",[19,67036,67037,67040],{},[478,67038,67039],{},"Answer:"," No! You always send JSON requests to Unified.to. We handle the conversion to XML behind the scenes for the SOAP API.",[19,67042,67043],{},[478,67044,67045],{},"Question: Can I use both the REST and Legacy APIs at the same time?",[19,67047,67048,67051],{},[478,67049,67050],{},"A****nswer:"," Absolutely. Unified.to lets you mix and match endpoints. For example, you can fetch attachments with REST and create applications with Legacy — all through the same unified model.",[19,67053,67054],{},[478,67055,67056],{},"Question: Is the Workday Legacy connector going to be deprecated?",[19,67058,67059,67061],{},[478,67060,67039],{}," Not anytime soon. Many Workday customers still rely on SOAP endpoints for critical operations. Unified.to will continue supporting it as long as Workday does.",[19,67063,67064],{},[478,67065,67066],{},"Question: Is authentication different for Legacy vs REST?",[19,67068,67069,67071],{},[478,67070,67039],{}," Yes — Workday REST typically uses OAuth 2.0, while the Legacy SOAP API uses basic authentication (aka WS-Security). Unified.to handles this complexity for you.",[19,67073,67074],{},[478,67075,67076],{},"Question: Are the data models the same between REST and Legacy?",[19,67078,67079,67081],{},[478,67080,67039],{}," Yes — Unified.to normalizes the data, so you get a consistent unified schema, no matter which Workday API is behind the scenes.",[19,67083,67084],{},[478,67085,67086],{},"Question: Can I switch from Legacy to REST later?",[19,67088,67089,67091],{},[478,67090,67039],{}," Yes. As Workday expands REST support, you can migrate endpoints over time. Our team will help you adapt with minimal changes on your side.",[19,67093,67094],{},[478,67095,67096],{},"Question: Will using both cost more?",[19,67098,67099,67101],{},[478,67100,67039],{}," No — there's no extra fee for using both. You only pay for your overall Unified.to usage.",[67,67103,16927],{"id":16926},[19,67105,67106,67107,67109],{},"Workday is gradually moving more features to its modern REST API — but some critical workflows still require the mature SOAP-based Legacy API. To ensure you don't lose any capability, Unified.to supports ",[478,67108,66853],{}," — giving you the best of both worlds.",[19,67111,67112,67115],{},[478,67113,67114],{},"Our recommendation:"," Use the REST API wherever possible for modern features and attachments, and rely on the Legacy API to cover any gaps (like creating jobs or applications). Unified.to handles all the complexity behind the scenes, so you can build faster with no surprises.",[19,67117,67118],{},[478,67119,67120],{},"Have more questions?",[19,67122,67123],{},"Reach out to our support team — we're here to help you get the best out of both Workday APIs!",{"title":107,"searchDepth":126,"depth":126,"links":67125},[67126,67127,67128],{"id":66857,"depth":126,"text":66858},{"id":67028,"depth":126,"text":67029},{"id":16926,"depth":126,"text":16927},"Workday provides two main API integration formats,",{"img":67131,"date":67132,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/workday_vs_workday_legacy_why_unified_supports_both-icon.png","2025-07-22T00:00:00.000Z","/guides/workday_vs_workday_legacy_why_unified_supports_both",{"title":66808,"description":67129},"guides/workday_vs_workday_legacy_why_unified_supports_both","gVez_ViR7xMX6z_jYakWqF_I_kaHdtWmOwXEATIXLEI",{"id":67138,"title":67139,"body":67140,"description":67154,"extension":1576,"meta":67977,"navigation":271,"path":67980,"seo":67981,"stem":67982,"__hash__":67983},"guides/guides/working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis.md","Working with hierarchical tree data in Storage, Messaging, and KMS APIs",{"type":9,"value":67141,"toc":67964},[67142,67145,67147,67152,67155,67157,67160,67182,67185,67187,67189,67199,67203,67209,67238,67242,67245,67271,67428,67435,67439,67442,67648,67662,67664,67667,67680,67875,67889,67893,67897,67900,67920,67923,67934,67939,67950,67952,67961],[12,67143,67139],{"id":67144},"working-with-hierarchical-tree-data-in-storage-messaging-and-kms-apis",[16,67146],{},[19,67148,67149],{},[22,67150,67151],{},"November 7, 2024",[19,67153,67154],{},"This guide explains how to retrieve and traverse hierarchical data structures (i.e., trees) when working with APIs that support parent-child relationships.",[67,67156,9690],{"id":9689},[19,67158,67159],{},"Many APIs organize their data in tree-like structures, where records can have parent-child relationships with each other.",[43,67161,67162,67167,67175],{},[46,67163,2288,67164,67166],{},[478,67165,62231],{}," represents both folders and files as a single object type, making tree traversal straightforward. While you can think of folders as the 'containers' for other files and folders, the API treats them all as the same object type.",[46,67168,2288,67169,11338,67171,67174],{},[478,67170,62263],{},[478,67172,67173],{},"Tasks API"," use a simple parent-child relationship where each object type can contain children of the next type (e.g., projects contain tasks, tasks contain comments, channels contain messages). Objects may also have parents of the same type.",[46,67176,67177,67178,67181],{},"Some ",[478,67179,67180],{},"KMS APIs"," have more complex relationships where pages and spaces can reference each other in multiple directions e.g., a mesh. While most KMS platforms use a simple tree structure (like Confluence), some (like Notion) support this more flexible mesh-like organization.",[19,67183,67184],{},"This guide will show you how to efficiently traverse these hierarchical structures to retrieve all the data you need.",[67,67186,13634],{"id":13633},[19,67188,13637],{},[72,67190,67191],{},[46,67192,67193,67194],{},"Basic understanding of ",[1614,67195,67198],{"href":67196,"rel":67197},"https://en.wikipedia.org/wiki/Tree_(abstract_data_type)",[1618],"tree data structures",[67,67200,67202],{"id":67201},"understanding-parent-child-relationships","Understanding parent-child relationships",[19,67204,67205,67206,67208],{},"When an API endpoint supports a ",[109,67207,38430],{}," parameter, it typically indicates that the data is organized in a hierarchical structure. To fully traverse this structure, you'll need to:",[43,67210,67211,67214,67217,67220],{},[46,67212,67213],{},"Get the top-level entities (parent nodes)",[46,67215,67216],{},"For each parent, retrieve its children by passing the parent's ID",[46,67218,67219],{},"Recursively repeat this process for any children that can also be parents",[46,67221,67222,67223,67226,67227,67229,67230,67232,67233,67235,67236],{},"For KMS Page, you can use its ",[109,67224,67225],{},"has_children"," field to determine if there are children pages to query. If ",[109,67228,67225],{}," is equal ",[109,67231,4182],{}," , then no children pages exist.  Some integrations di not return this information, so if this field is ",[109,67234,35829],{}," or missing, then you should treat it as a ",[109,67237,1340],{},[35,67239,67241],{"id":67240},"example-messaging-platforms","Example: Messaging platforms",[19,67243,67244],{},"Let's look at how this works with Discord:",[43,67246,67247,67250,67253,67258],{},[46,67248,67249],{},"Discord servers (also called \"guilds\") are top-level parents",[46,67251,67252],{},"Channels exist within servers as children",[46,67254,67255,67256],{},"Messages are also related to channels through their ",[109,67257,38430],{},[46,67259,67260,67261],{},"To get all channels:\n",[72,67262,67263,67266],{},[46,67264,67265],{},"First retrieve all guilds (servers)",[46,67267,67268,67269],{},"Then get channels for each guild using the guild's ID as the ",[109,67270,55050],{},[102,67272,67274],{"className":9951,"code":67273,"language":9953,"meta":107,"style":107},"async function getAllChannels(connectionId) {\n    // Get all top-level guilds first\n    const guilds = await sdk.messaging.listMessagingChannels({\n        connectionId,\n    });\n\n    let allChannels = [];\n\n    // For each guild, get its channels\n    for (const guild of guilds.data) {\n        const channels = await sdk.messaging.listMessagingChannels({\n            connectionId,\n            parentChannelId: guild.id,\n        });\n        allChannels = allChannels.concat(channels.data);\n    }\n\n    return allChannels;\n}\n",[109,67275,67276,67291,67296,67315,67319,67323,67327,67338,67342,67347,67363,67380,67384,67389,67393,67409,67413,67417,67424],{"__ignoreMap":107},[112,67277,67278,67280,67282,67285,67287,67289],{"class":114,"line":115},[112,67279,1377],{"class":229},[112,67281,509],{"class":229},[112,67283,67284],{"class":118}," getAllChannels",[112,67286,456],{"class":236},[112,67288,518],{"class":517},[112,67290,526],{"class":236},[112,67292,67293],{"class":114,"line":126},[112,67294,67295],{"class":578},"    // Get all top-level guilds first\n",[112,67297,67298,67300,67303,67305,67307,67310,67313],{"class":114,"line":135},[112,67299,1435],{"class":229},[112,67301,67302],{"class":129}," guilds",[112,67304,354],{"class":229},[112,67306,539],{"class":229},[112,67308,67309],{"class":236}," sdk.messaging.",[112,67311,67312],{"class":118},"listMessagingChannels",[112,67314,363],{"class":236},[112,67316,67317],{"class":114,"line":147},[112,67318,15585],{"class":236},[112,67320,67321],{"class":114,"line":202},[112,67322,15149],{"class":236},[112,67324,67325],{"class":114,"line":208},[112,67326,272],{"emptyLinePlaceholder":271},[112,67328,67329,67331,67334,67336],{"class":114,"line":291},[112,67330,14442],{"class":229},[112,67332,67333],{"class":236}," allChannels ",[112,67335,335],{"class":229},[112,67337,1292],{"class":236},[112,67339,67340],{"class":114,"line":299},[112,67341,272],{"emptyLinePlaceholder":271},[112,67343,67344],{"class":114,"line":307},[112,67345,67346],{"class":578},"    // For each guild, get its channels\n",[112,67348,67349,67351,67353,67355,67358,67360],{"class":114,"line":315},[112,67350,20309],{"class":229},[112,67352,1419],{"class":236},[112,67354,277],{"class":229},[112,67356,67357],{"class":129}," guild",[112,67359,1427],{"class":229},[112,67361,67362],{"class":236}," guilds.data) {\n",[112,67364,67365,67367,67370,67372,67374,67376,67378],{"class":114,"line":323},[112,67366,14472],{"class":229},[112,67368,67369],{"class":129}," channels",[112,67371,354],{"class":229},[112,67373,539],{"class":229},[112,67375,67309],{"class":236},[112,67377,67312],{"class":118},[112,67379,363],{"class":236},[112,67381,67382],{"class":114,"line":329},[112,67383,14510],{"class":236},[112,67385,67386],{"class":114,"line":341},[112,67387,67388],{"class":236},"            parentChannelId: guild.id,\n",[112,67390,67391],{"class":114,"line":346},[112,67392,14515],{"class":236},[112,67394,67395,67398,67400,67403,67406],{"class":114,"line":366},[112,67396,67397],{"class":236},"        allChannels ",[112,67399,335],{"class":229},[112,67401,67402],{"class":236}," allChannels.",[112,67404,67405],{"class":118},"concat",[112,67407,67408],{"class":236},"(channels.data);\n",[112,67410,67411],{"class":114,"line":381},[112,67412,3946],{"class":236},[112,67414,67415],{"class":114,"line":387},[112,67416,272],{"emptyLinePlaceholder":271},[112,67418,67419,67421],{"class":114,"line":392},[112,67420,572],{"class":229},[112,67422,67423],{"class":236}," allChannels;\n",[112,67425,67426],{"class":114,"line":409},[112,67427,584],{"class":236},[19,67429,67430,2251,67432],{},[478,67431,18117],{},[1614,67433,62263],{"href":19650,"rel":67434},[1618],[35,67436,67438],{"id":67437},"example-file-storage-systems","Example: File storage systems",[19,67440,67441],{},"File storage systems are another common example of hierarchical data. Here's how to recursively traverse a file system to get all files:",[102,67443,67445],{"className":9951,"code":67444,"language":9953,"meta":107,"style":107},"async function getAllFiles(connectionId, parentId) {\n    const response = await sdk.storage.listStorageFiles({\n        connectionId,\n        parentId,\n    });\n\n    if (!response.data) {\n        return [];\n    }\n\n    let allFiles = [];\n\n    for (const item of response.data) {\n        if (item.type === 'FOLDER') {\n            // Recursively get files from subfolders\n            const subfolderFiles = await getAllFiles(connectionId, item.id);\n            allFiles = allFiles.concat(subfolderFiles);\n        } else {\n            allFiles.push(item);\n        }\n    }\n\n    return allFiles;\n}\n",[109,67446,67447,67467,67483,67487,67492,67496,67500,67511,67517,67521,67525,67536,67540,67556,67570,67575,67592,67607,67615,67625,67629,67633,67637,67644],{"__ignoreMap":107},[112,67448,67449,67451,67453,67456,67458,67460,67462,67465],{"class":114,"line":115},[112,67450,1377],{"class":229},[112,67452,509],{"class":229},[112,67454,67455],{"class":118}," getAllFiles",[112,67457,456],{"class":236},[112,67459,518],{"class":517},[112,67461,1046],{"class":236},[112,67463,67464],{"class":517},"parentId",[112,67466,526],{"class":236},[112,67468,67469,67471,67473,67475,67477,67479,67481],{"class":114,"line":126},[112,67470,1435],{"class":229},[112,67472,17600],{"class":129},[112,67474,354],{"class":229},[112,67476,539],{"class":229},[112,67478,23572],{"class":236},[112,67480,23575],{"class":118},[112,67482,363],{"class":236},[112,67484,67485],{"class":114,"line":135},[112,67486,15585],{"class":236},[112,67488,67489],{"class":114,"line":147},[112,67490,67491],{"class":236},"        parentId,\n",[112,67493,67494],{"class":114,"line":202},[112,67495,15149],{"class":236},[112,67497,67498],{"class":114,"line":208},[112,67499,272],{"emptyLinePlaceholder":271},[112,67501,67502,67504,67506,67508],{"class":114,"line":291},[112,67503,15209],{"class":229},[112,67505,1419],{"class":236},[112,67507,375],{"class":229},[112,67509,67510],{"class":236},"response.data) {\n",[112,67512,67513,67515],{"class":114,"line":299},[112,67514,15225],{"class":229},[112,67516,1292],{"class":236},[112,67518,67519],{"class":114,"line":307},[112,67520,3946],{"class":236},[112,67522,67523],{"class":114,"line":315},[112,67524,272],{"emptyLinePlaceholder":271},[112,67526,67527,67529,67532,67534],{"class":114,"line":323},[112,67528,14442],{"class":229},[112,67530,67531],{"class":236}," allFiles ",[112,67533,335],{"class":229},[112,67535,1292],{"class":236},[112,67537,67538],{"class":114,"line":329},[112,67539,272],{"emptyLinePlaceholder":271},[112,67541,67542,67544,67546,67548,67551,67553],{"class":114,"line":341},[112,67543,20309],{"class":229},[112,67545,1419],{"class":236},[112,67547,277],{"class":229},[112,67549,67550],{"class":129}," item",[112,67552,1427],{"class":229},[112,67554,67555],{"class":236}," response.data) {\n",[112,67557,67558,67560,67563,67565,67568],{"class":114,"line":346},[112,67559,14585],{"class":229},[112,67561,67562],{"class":236}," (item.type ",[112,67564,14573],{"class":229},[112,67566,67567],{"class":122}," 'FOLDER'",[112,67569,526],{"class":236},[112,67571,67572],{"class":114,"line":366},[112,67573,67574],{"class":578},"            // Recursively get files from subfolders\n",[112,67576,67577,67580,67583,67585,67587,67589],{"class":114,"line":381},[112,67578,67579],{"class":229},"            const",[112,67581,67582],{"class":129}," subfolderFiles",[112,67584,354],{"class":229},[112,67586,539],{"class":229},[112,67588,67455],{"class":118},[112,67590,67591],{"class":236},"(connectionId, item.id);\n",[112,67593,67594,67597,67599,67602,67604],{"class":114,"line":387},[112,67595,67596],{"class":236},"            allFiles ",[112,67598,335],{"class":229},[112,67600,67601],{"class":236}," allFiles.",[112,67603,67405],{"class":118},[112,67605,67606],{"class":236},"(subfolderFiles);\n",[112,67608,67609,67611,67613],{"class":114,"line":392},[112,67610,14613],{"class":236},[112,67612,14616],{"class":229},[112,67614,280],{"class":236},[112,67616,67617,67620,67622],{"class":114,"line":409},[112,67618,67619],{"class":236},"            allFiles.",[112,67621,14547],{"class":118},[112,67623,67624],{"class":236},"(item);\n",[112,67626,67627],{"class":114,"line":422},[112,67628,4052],{"class":236},[112,67630,67631],{"class":114,"line":435},[112,67632,3946],{"class":236},[112,67634,67635],{"class":114,"line":440},[112,67636,272],{"emptyLinePlaceholder":271},[112,67638,67639,67641],{"class":114,"line":4949},[112,67640,572],{"class":229},[112,67642,67643],{"class":236}," allFiles;\n",[112,67645,67646],{"class":114,"line":4960},[112,67647,584],{"class":236},[19,67649,67650,2251,67652,67655,67658],{},[478,67651,18117],{},[1614,67653,13387],{"href":62229,"rel":67654},[1618],[1614,67656,2251],{"href":62229,"rel":67657},[1618],[1614,67659,67661],{"href":62229,"rel":67660},[1618],"Storage API",[67,67663,10075],{"id":10074},[19,67665,67666],{},"When working with hierarchical data:",[43,67668,67669],{},[46,67670,67671,67674,67675,11338,67677,67679],{},[478,67672,67673],{},"Implement pagination",": Some nodes might have many children. Use the ",[109,67676,2680],{},[109,67678,2693],{}," parameters to handle large datasets.",[102,67681,67683],{"className":9951,"code":67682,"language":9953,"meta":107,"style":107},"async function getAllChannelsWithPagination(connectionId, parentId = undefined) {\n    let allChannels = [];\n    let offset = 0;\n    const limit = 100;\n\n    while (true) {\n        const response = await sdk.messaging.listMessagingChannels({\n            connectionId,\n            parentChannelId: parentId,\n            limit,\n            offset,\n        });\n\n        if (!response.data || response.data.length === 0) {\n            break;\n        }\n\n        allChannels = allChannels.concat(response.data);\n        offset += limit;\n    }\n\n    return allChannels;\n}\n",[109,67684,67685,67709,67719,67731,67743,67747,67757,67773,67777,67782,67786,67790,67794,67798,67822,67828,67832,67836,67848,67857,67861,67865,67871],{"__ignoreMap":107},[112,67686,67687,67689,67691,67694,67696,67698,67700,67702,67704,67707],{"class":114,"line":115},[112,67688,1377],{"class":229},[112,67690,509],{"class":229},[112,67692,67693],{"class":118}," getAllChannelsWithPagination",[112,67695,456],{"class":236},[112,67697,518],{"class":517},[112,67699,1046],{"class":236},[112,67701,67464],{"class":517},[112,67703,354],{"class":229},[112,67705,67706],{"class":129}," undefined",[112,67708,526],{"class":236},[112,67710,67711,67713,67715,67717],{"class":114,"line":126},[112,67712,14442],{"class":229},[112,67714,67333],{"class":236},[112,67716,335],{"class":229},[112,67718,1292],{"class":236},[112,67720,67721,67723,67725,67727,67729],{"class":114,"line":135},[112,67722,14442],{"class":229},[112,67724,14445],{"class":236},[112,67726,335],{"class":229},[112,67728,14450],{"class":129},[112,67730,237],{"class":236},[112,67732,67733,67735,67737,67739,67741],{"class":114,"line":147},[112,67734,1435],{"class":229},[112,67736,14430],{"class":129},[112,67738,354],{"class":229},[112,67740,14435],{"class":129},[112,67742,237],{"class":236},[112,67744,67745],{"class":114,"line":202},[112,67746,272],{"emptyLinePlaceholder":271},[112,67748,67749,67751,67753,67755],{"class":114,"line":208},[112,67750,14461],{"class":229},[112,67752,1419],{"class":236},[112,67754,1340],{"class":129},[112,67756,526],{"class":236},[112,67758,67759,67761,67763,67765,67767,67769,67771],{"class":114,"line":291},[112,67760,14472],{"class":229},[112,67762,17600],{"class":129},[112,67764,354],{"class":229},[112,67766,539],{"class":229},[112,67768,67309],{"class":236},[112,67770,67312],{"class":118},[112,67772,363],{"class":236},[112,67774,67775],{"class":114,"line":299},[112,67776,14510],{"class":236},[112,67778,67779],{"class":114,"line":307},[112,67780,67781],{"class":236},"            parentChannelId: parentId,\n",[112,67783,67784],{"class":114,"line":315},[112,67785,14505],{"class":236},[112,67787,67788],{"class":114,"line":323},[112,67789,14500],{"class":236},[112,67791,67792],{"class":114,"line":329},[112,67793,14515],{"class":236},[112,67795,67796],{"class":114,"line":341},[112,67797,272],{"emptyLinePlaceholder":271},[112,67799,67800,67802,67804,67806,67809,67811,67814,67816,67818,67820],{"class":114,"line":346},[112,67801,14585],{"class":229},[112,67803,1419],{"class":236},[112,67805,375],{"class":229},[112,67807,67808],{"class":236},"response.data ",[112,67810,1109],{"class":229},[112,67812,67813],{"class":236}," response.data.",[112,67815,14591],{"class":129},[112,67817,14594],{"class":229},[112,67819,14450],{"class":129},[112,67821,526],{"class":236},[112,67823,67824,67826],{"class":114,"line":366},[112,67825,14623],{"class":229},[112,67827,237],{"class":236},[112,67829,67830],{"class":114,"line":381},[112,67831,4052],{"class":236},[112,67833,67834],{"class":114,"line":387},[112,67835,272],{"emptyLinePlaceholder":271},[112,67837,67838,67840,67842,67844,67846],{"class":114,"line":392},[112,67839,67397],{"class":236},[112,67841,335],{"class":229},[112,67843,67402],{"class":236},[112,67845,67405],{"class":118},[112,67847,48426],{"class":236},[112,67849,67850,67853,67855],{"class":114,"line":409},[112,67851,67852],{"class":236},"        offset ",[112,67854,14605],{"class":229},[112,67856,14608],{"class":236},[112,67858,67859],{"class":114,"line":422},[112,67860,3946],{"class":236},[112,67862,67863],{"class":114,"line":435},[112,67864,272],{"emptyLinePlaceholder":271},[112,67866,67867,67869],{"class":114,"line":440},[112,67868,572],{"class":229},[112,67870,67423],{"class":236},[112,67872,67873],{"class":114,"line":4949},[112,67874,584],{"class":236},[43,67876,67877,67883],{},[46,67878,67879,67882],{},[478,67880,67881],{},"Handle rate limits",": When recursively fetching data, you might hit API rate limits. Implement backoff strategies and respect the provider's limits.",[46,67884,67885,67888],{},[478,67886,67887],{},"Cache parent IDs",": If you need to traverse the same structure multiple times, consider caching the parent-child relationships to reduce API calls.",[67,67890,67892],{"id":67891},"integration-specific-gotchas","Integration-specific gotchas",[35,67894,67896],{"id":67895},"working-with-sharepoint","Working with SharePoint",[19,67898,67899],{},"SharePoint implements a distinct three-level hierarchy that requires special attention:",[43,67901,67902,67908,67914],{},[46,67903,67904,67907],{},[478,67905,67906],{},"Sites"," (top level)",[46,67909,67910,67913],{},[478,67911,67912],{},"Drives"," (within sites)",[46,67915,67916,67919],{},[478,67917,67918],{},"Folders/Files"," (within drives)",[19,67921,67922],{},"To work with SharePoint's file system:",[43,67924,67925,67928,67931],{},[46,67926,67927],{},"First retrieve the site ID (top-most parent)",[46,67929,67930],{},"Use the site ID to list drives",[46,67932,67933],{},"Use the drive ID to create or access folders and files",[19,67935,67936],{},[478,67937,67938],{},"Important notes:",[72,67940,67941,67944,67947],{},[46,67942,67943],{},"You cannot create files or folders directly at the site level - you must first select a drive",[46,67945,67946],{},"Write operations are only supported for folders and files, not for sites or drives",[46,67948,67949],{},"Pagination is not supported for sites and drives listings",[67,67951,25945],{"id":25944},[72,67953,67954],{},[46,67955,67956],{},[1614,67957,67960],{"href":67958,"rel":67959},"https://docs.unified.to/guides/how_to_use_the_unified_file_storage_api#how-to-use-the-unified-file-storage-api",[1618],"How to use the Unified File Storage API",[1558,67962,67963],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":107,"searchDepth":126,"depth":126,"links":67965},[67966,67967,67968,67972,67973,67976],{"id":9689,"depth":126,"text":9690},{"id":13633,"depth":126,"text":13634},{"id":67201,"depth":126,"text":67202,"children":67969},[67970,67971],{"id":67240,"depth":135,"text":67241},{"id":67437,"depth":135,"text":67438},{"id":10074,"depth":126,"text":10075},{"id":67891,"depth":126,"text":67892,"children":67974},[67975],{"id":67895,"depth":135,"text":67896},{"id":25944,"depth":126,"text":25945},{"img":67978,"date":67979,"tag":1580},"https://s3.us-east-2.amazonaws.com/unified-article-images/working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis-icon.png","2024-11-07T00:00:00.000Z","/guides/working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis",{"title":67139,"description":67154},"guides/working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis","P1eS4MXN2N6JkuuF9VhR1yIX6hA6vrXlyKysZzQ1biM",1775596376665]